EF添加实体时,也将此附加到错误的实体但具有相同的属性

时间:2018-09-26 10:31:27

标签: c# entity-framework entity-framework-6 entity

我有这种类型的实体

具有“ n”个服务的公司和具有“ n”个容器且具有“ n”个服务的公司

  • 公司(id_s)->服务(id_s,uuid_c)
  • 公司(id_s)->容器(uuid_c)->服务(id_s,uuid_c)

当我向公司添加带有容器的服务时...我有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是服务列表,包括具有容器和服务的公司

1 个答案:

答案 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。 您无需在发布的代码中添加任何内容。