Ho questo tipo di entità
Azienda con servizio "n" e azienda con "n" container con servizio "n"
Quando aggiungo un servizio, con container, ad azienda ... Ho 1 servizio e 1 contenitore con 1 servizio. Quando aggiungo un altro servizio, senza contenitore (e uuid), alla stessa azienda ... Ho 2 servizi e 1 contenitore con 2 servizi! :(
Perchè questo?
Schema veloce della mia configurazione dell'entità.
Contenitore:
HasRequired(e => e.company)
.WithMany(e => e.container)
.HasForeignKey(e => e.id_company)
.WillCascadeOnDelete(false);
Servizio:
HasOptional(e => e.container)
.WithMany(e => e.services)
.HasForeignKey(e => e.uuid_container)
.WillCascadeOnDelete(false);
Codice per il recupero dei dati dal database
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 è un elenco di servizi, includendo società che hanno container e servizi
Per essere onesti, sono piuttosto cunfused dal tuo codice e non riesco a capire cosa stavi cercando di fare. Cercherò di fornire un approccio corretto per il tuo problema in base a come hai descritto le tue entità e relazioni.
Le tue entità:
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; }
}
Hai detto che non stai ancora aggiungendo alcun dato al database, quindi concentrati sul recupero dei dati esistenti.
using (Context context = new Context())
{
var company = context.Companies.ToList();
}
Se hai disattivato il caricamento lento, devi includere le tabelle figlio con 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();
}
Se le relazioni sono state definite correttamente, l'oggetto della propria azienda deve aver caricato correttamente tutti gli oggetti.
Se ho torto di qualcosa, fammi sapere, finora buona fortuna.
Modifica finale
Consente di avere dati di esempio
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 }
Quindi con qualche metodo get come questo:
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();
}
Ti ritroverai con un oggetto che assomiglia a questo:
Company
services: (1, 2)
containers: (1)
services: (1)
Dove azienda è oggetto, servizi e contenitori sono raccolte di oggetti. I numeri tra parentesi sono identificativi degli oggetti di enitità all'interno delle raccolte. Non è necessario aggiungere nulla come nel codice che hai postato.