Tengo este tipo de entidad
Empresa con servicio 'n' y Compañía con servicio 'n' Contenedor con servicio 'n'
Cuando agrego un servicio, con contenedor, a la compañía ... Tengo 1 servicio y 1 contenedor con 1 servicio. Cuando agrego otro servicio, sin contenedor (y uuid), a la misma compañía ... ¡Tengo 2 servicios y 1 contenedor con 2 servicios! :(
¿Por qué esto?
Esquema rápido de la configuración de mi entidad.
Envase:
HasRequired(e => e.company)
.WithMany(e => e.container)
.HasForeignKey(e => e.id_company)
.WillCascadeOnDelete(false);
Servicio:
HasOptional(e => e.container)
.WithMany(e => e.services)
.HasForeignKey(e => e.uuid_container)
.WillCascadeOnDelete(false);
Código para recuperar datos de la base de datos
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 es una lista de servicios, con compañía que incluye contenedores y servicios.
Para ser justos, estoy bastante confundido con tu código y no puedo averiguar qué intentabas hacer. Trataré de proporcionar el enfoque correcto para su problema en función de cómo describió sus entidades y relaciones.
Tus entidades:
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; }
}
Dijo que todavía no está agregando ningún dato a la base de datos, así que nos centramos en recuperar los datos existentes.
using (Context context = new Context())
{
var company = context.Companies.ToList();
}
Si ha deshabilitado la carga diferida, debe incluir las tablas secundarias 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();
}
Si ha definido correctamente las relaciones, su objeto de empresa debería haber cargado correctamente todos los objetos.
Si estoy totalmente equivocado acerca de algo, hágamelo saber, hasta ahora, buena suerte.
Edición final
Vamos a tener datos de ejemplo
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 }
Luego con algún método de obtención como este:
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();
}
Terminarás con un objeto que se ve así:
Company
services: (1, 2)
containers: (1)
services: (1)
Donde Empresa es objeto, servicios y contenedores son colecciones de objetos. Los números entre paréntesis son identificadores de objetos de enitity dentro de colecciones. No necesitas agregar nada como en el código que publicaste.