我使用的是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);
如果你在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.