J'ai ce type d'entité
Société avec 'n' Service et société avec 'n' Container avec 'n' Service
Lorsque j'ajoute un service, avec conteneur, à une entreprise ... j'ai 1 service et 1 conteneur avec 1 service. Quand j'ajoute un autre service, sans conteneur (et uuid), à la même entreprise ... J'ai 2 services et 1 conteneur avec 2 services! :(
Pourquoi ça?
Schéma rapide de la configuration de mon entité.
Récipient:
HasRequired(e => e.company)
.WithMany(e => e.container)
.HasForeignKey(e => e.id_company)
.WillCascadeOnDelete(false);
Un service:
HasOptional(e => e.container)
.WithMany(e => e.services)
.HasForeignKey(e => e.uuid_container)
.WillCascadeOnDelete(false);
Code pour récupérer les données de la base de données
if (!result.Any(x => x.id == cfi.id_company))
{
result.Add(cfi.Company);
}
else
{
result.Where(x => x.id == cfi.id_company).FirstOrDefault().result
.Where(x => x.id == cfi.id_company).FirstOrDefault();
a.services.Add(cfi.Company.services.FirstOrDefault());
}
cfi est une liste de services avec la société qui a un conteneur et un service
Pour être juste, votre code me laisse plutôt perplexe et je ne peux pas comprendre ce que vous tentiez de faire. Je vais essayer de fournir une approche correcte de votre problème en fonction de la manière dont vous avez décrit vos entités et vos relations.
Vos entités:
public class Company
{
public int id { get; set }
public virtual ICollection<Sevice> Services { get; set; }
public virtual ICollection<Container> Containers { get; set; }
}
public class Container
{
public int id { get; set; }
public int id_company { get; set; }
public virtual Company company { get; set; }
public virtual ICollection<Sevice> Services { get; set; }
}
public class Sevice
{
public int id { get; set; }
public int? id_company { get; set; }
public int? id_container { get; set; }
public virtual Company company { get; set; }
public virtual Container container { get; set; }
}
Vous avez dit que vous n’ajoutez pas encore de données à la base de données, nous allons donc nous concentrer sur la récupération des données existantes.
using (Context context = new Context())
{
var company = context.Companies.ToList();
}
Si vous avez désactivé le chargement différé, vous devez inclure vos tables enfants avec include
.
using (Context context = new Context())
{
var company = context.Companies.Include(g => g.Services)
.Include(g => g.Containers)
.Include(g => g.Containers.Select(s => s.Services))
.ToList();
}
Si vous avez défini correctement les relations, votre objet société doit avoir correctement chargé tous les objets.
Si je me trompe complètement à propos de quelque chose, faites-le-moi savoir, bonne chance jusqu'à présent.
Édition finale
Permet d'avoir des données d'exemple
Company { id: 1 }
Container { id: 1, id_company: 1 }
Service { id: 1, id_company: 1, id_container: 1 }
Service { id: 2, id_company: 1, id_container: null }
Puis avec une méthode get comme celle-ci:
using (Context context = new Context())
{
var company = context.Companies.Where(x => x.id == someCompanyId)
.Include(g => g.Services)
.Include(g => g.Containers)
.Include(g => g.Containers.Select(s => s.Services))
.ToList();
}
Vous allez vous retrouver avec un objet qui ressemble à ceci:
Company
services: (1, 2)
containers: (1)
services: (1)
Où Company est un objet, les services et les conteneurs sont des collections d'objets. Les nombres entre parenthèses sont les identifiants des objets enitity dans les collections. Vous n'avez pas besoin d'ajouter quoi que ce soit comme dans le code que vous avez posté.