【问题标题】:EF when add Entity, attach this also to mistake Entity but with same propertyEF 添加实体时,也将其附加到错误的实体但具有相同的属性
【发布时间】:2018-09-26 10:31:26
【问题描述】:

我有这种类型的实体

具有“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 是服务列表,包括拥有容器和服务的公司

【问题讨论】:

  • 你能显示代码吗,你用来保存你描述的这两个场景?
  • 不,我不保存这个。暂时只读...
  • 好的,那么您用于从数据库中检索数据的代码?
  • 好的,我建议修改您的编辑
  • 变量result和a的数据类型是什么?

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


【解决方案1】:

公平地说,我对您的代码感到很困惑,无法弄清楚您要做什么。我将尝试根据您描述实体和关系的方式为您的问题提供正确的方法。

您的实体:

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)

Company 是对象,服务和容器是对象的集合。括号中的数字是集合内实体对象的 id。 您不需要在您发布的代码中添加任何内容。

【讨论】:

  • int id_container 应该可以为空 -> int? id_container
  • 是的,已编辑。这是否有帮助或您的问题与其他问题有关?
  • 是的,如果我通过包含它来获取实体,则返回 correvt 对象,但如果我添加一个类似 up 的列表,我有双重服务(没关系)和 1 个带有 2 个服务的容器(不好,只有一个)。谢谢大家
  • 我想我现在明白了。您在容器中的服务必须没有定义 companyId。 container_id 或 company_Id。如果您同时定义了两者,那么该服务将出现在公司服务公司容器中。
  • 好的,但我的 company.service 是所有服务的列表。我的容器相同或更少,这取决于 id_container 是否稳定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2018-03-14
  • 1970-01-01
  • 2018-02-12
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多