c# - 使用嵌套的子实体重新附加修改后的实体

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

我正在使用 EF 6.1

型号

我有条目,包含一个用户,它本身包含一个城市。该条目还有一个供应商。 我使用 .AsNoTracking() 检索我的条目:

 return dbContext.Set<entry>()
            .Include(x => x.user.city)
            .Include(x => x.supplier).AsNoTracking().ToList();

我有更多的属性,但它们都很相似。

查看

用户看到一个条目,可以更改所有属性的所有成员变量。他可以更改条目 ID(不是 PrimaryKey)。他可以更改用户的姓氏。他可以更改城市的名称或邮政编码。等等……

问题

想想这个例子:

条目:id = 123

用户:first_name = "Foo", last_name = "Bar"

城市:名称 = "FooCity", zip = "4711"

用户看到了这个。他现在可以将 first_name 更改为“Peter”并单击保存。然后我这样做:

dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry);
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified;
dbContext.SaveChanges();

但是 EF 会复制所有子实体。所以在数据库中我有一个新用户,如果用户尚不存在,这可能是我想要的。但是这个用户指向一个新的城市,尽管这个城市没有改变。此外,供应商现在在数据库中存在两次。

为什么 AsNoTracking()

我使用了 AsNoTracking() 因为用户看到了真实的实体。如果他更改某些内容,它会直接影响所有实体:将 first_name 设置为“Peter”所有以“Foo”“Bar”为用户的条目,然后以“Peter”“Bar”为用户。但是只有修改后的实体才应该有这个变化。我认为发生这种情况是因为我在上下文中直接修改了“真实”实体的成员变量。

问题

如何在不重新创建现有子实体的情况下重新附加修改后的实体。

如何在不使用 AsNoTracking()

的情况下实现我想要的

最佳答案

我正在尝试与您相同的事情,我不确定是否能很好地理解您的原因,但这份文档可能会对您有所帮助。

https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx

此外,我几乎可以肯定您不需要在您的示例中执行 .Add(),这将在大多数情况下生成新记录,或者在适用时生成“未更改”。

我可以通过附加和应用 state = modified 来实现为同一实体附加新值,仍在研究如何重新附加相关属性(我最糟糕的问题是 1toN 关系)

检查“将现有实体附加到上下文”下,它可能会为您提供解决方案。

我还在研究代码项目中的一篇有趣的帖子: https://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor

似乎这个人发明了一个扩展来在 Entity Framework 上重新附加节点图,比如“这里你有 EF 缺少的功能。”我会试一试。

问候。

关于c# - 使用嵌套的子实体重新附加修改后的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43930191/

相关文章:

c# - 将 JSON 数据发布到 WCF 服务时出现错误 415

c# - 移动纸板

c# - 手动键入 sql 以映射到 c# 对象,就像 .Include ("") 方法

c# - 为什么 Entity Framework 在 WHERE 子句中添加不必要的 (AND [param] IS NOT NULL)?

c# - C# 中类库的全局错误处理程序

c# - 在 C# 中为多个 ID 读取多个 Outlook 电子邮件

asp.net-mvc - 您可以将 Orchard CMS 与 Entity Framework 5 一起使用而不是 NHibernate 吗?

.net - 循环引用和 WCF

entity-framework-6 - 'PK_dbo.EntityName' 不是约束。无法删除约束。EF6

c# - MVC 安全 : ViewModel vs. [Bind()] 注释。两者都需要,还是其中之一就足够了?