entity-framework - 实体框架在引用表中创建新条目而不是使用现有条目
问题描述
我正在使用 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.com/en-us/dotnet/api/system.data.entity.dbextensions.asnotracking?view=entity-framework-5.0.0
推荐阅读
- google-chrome - Chrome 桌面上的“为您推荐的文章”建议(Chrome 内容建议)
- node.js - Dynamo Db Accelerator 应该将响应时间减少到微秒
- python - 在 pygame 应用程序中实施时的数独求解器性能问题
- javascript - 如何为带有插槽的 vuejs 配置 facebook 插件
- java - 如何将字符串(“95941634.164”)转换为浮点数
- ios - 如果项目部署版本低于 SDK 版本,则应用检查导入语句
- android - onItemAtEndLoaded() 方法仅被调用一次并且不会在分页库中再次重试
- sql - 如何拆分字符串 SQL 从到?
- c++ - 如何在一个类中存储多个位图?
- r - 使用 predict() 或使用显式拟合方程计算的 y 值之间的差异