我有这种类型的实体
具有“ 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是服务列表,包括具有容器和服务的公司
答案 0 :(得分:0)
说句公道话,我对您的代码感到困惑,无法弄清楚您要做什么。我将根据您描述实体和关系的方式为您的问题提供正确的方法。
您的实体:
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)
公司是对象,服务和容器是对象的集合。括号中的数字是集合内实体对象的ID。 您无需在发布的代码中添加任何内容。