我有这种类型的实体
公司提供'n'服务和公司'n'集装箱'n'服务
当我向公司添加一个带有容器的服务时......我有1个服务和1个带有1个服务的容器。当我添加另一个服务,没有容器(和uuid),到同一家公司...我有2个服务和1个容器与2服务! :(
为什么这个?
我的实体配置的快速架构。
容器:
HasRequired(e => e.company)
.WithMany(e => e.container)
.HasForeignKey(e => e.id_company)
.WillCascadeOnDelete(false);
服务:
HasOptional(e => e.container)
.WithMany(e => e.services)
.HasForeignKey(e => e.uuid_container)
.WillCascadeOnDelete(false);
从数据库中检索数据的代码
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是一个服务列表,包括具有容器和服务的公司
公平地说,我很反感你的代码并且无法弄清楚你想要做什么。我将根据您描述实体和关系的方式,尝试为您的问题提供正确的方法。
你的实体:
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; }
}
您说您还没有向数据库添加任何数据,因此我们将重点放在检索现有数据上。
using (Context context = new Context())
{
var company = context.Companies.ToList();
}
如果您已禁用延迟加载,则需要在子表中包含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();
}
如果您已正确定义关系,则公司对象应正确加载所有对象。
如果我对某些事情做错了,请告诉我,到目前为止好运。
最终编辑
让我们有示例数据
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 }
然后使用这样的get方法:
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();
}
最终会得到如下所示的对象:
Company
services: (1, 2)
containers: (1)
services: (1)
公司是对象,服务和容器是对象的集合。括号中的数字是集合中的enitity对象的id。你不需要在你发布的代码中添加任何东西。