首页 > 解决方案 > 实体框架在引用表中创建新条目而不是使用现有条目

问题描述

我正在使用 EF 代码优先方法,我有三种类型

public class A
{
     public int Id {get; set;}
     public C C {get; set;}
}

public class B
{
     public int Id {get; set;}
     public C C {get; set;}
}
public class C
{
     public int Id {get; set;}
}

当我在 B 中创建一个条目时,会按预期在 C 中创建一个新行。我想引用 B 在 A 中创建的同一行。如下所示

  A a = new A();
  a.C = GetC(id);
  dbContext.A.Add(a);

 public C GetC(int id)
 {
     return dbContext.C.FirstOrDefault(c => c.id == id);
 }

当我执行上述操作时,会在 C 中创建一个新条目。如何避免新条目我想使用由 B 创建的相同旧条目?

我已尝试执行以下操作,但引用另一个相同类型的实体已经具有相同的主键值会导致失败。

  A a = new A();
  a.C = dbContext.C.FirstOrDefault(c => c.id == id);
  dbContext.A.Add(a);

标签: entity-frameworkef-code-first

解决方案


如果你在 ef 中工作,那么应该有外键(如在数据库中),如果你将外键添加到 a,这应该足以建立关系。

但是在您的示例中,您可以使用以下内容:

  A a = new A();
  a.C = dbContext.C.AsNoTracking().FirstOrDefault(c => c.id == id);
  dbContext.A.Add(a);    

AsNoTracking之后- dbcontect 不会缓存和跟踪它。您可以阅读更多相关信息:https ://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.0


推荐阅读