实体框架在引用表中创建一个新条目,而不是使用现有的条目。

问题描述 投票:0回答:1

我使用的是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-framework ef-code-first
1个回答
1
投票

如果你在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.comen-usdotnetapisystem.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.

© www.soinside.com 2019 - 2024. All rights reserved.