我使用的是EF 6.1
模型
我有条目,其中包含一个本身包含城市的用户。该条目还有一个供应商。 我用.AsNoTracking():
检索我的条目 return dbContext.Set<entry>()
.Include(x => x.user.city)
.Include(x => x.supplier).AsNoTracking().ToList();
我有更多属性,但它们都很相似。
查看
用户看到一个条目,可以更改所有属性的所有成员变量。他可以更改条目ID(而不是PrimaryKey)。他可以更改用户的姓氏。他可以更改城市的名称或邮政编码。等等...
问题
想想这个例子:
条目:id = 123
user:first_name =&#34; Foo&#34;,last_name =&#34; Bar&#34;
city:name =&#34; FooCity&#34;,zip_code =&#34; 4711&#34;
用户看到了这一点。他现在可以将first_name更改为&#34; Peter&#34;然后单击“保存”然后我就这样做了:
dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry);
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified;
dbContext.SaveChanges();
然后EF复制了所有的孩子。所以在DB中我有一个新用户,如果用户还不存在,这可能就是我想要的。但是这个用户指向一个新的城市,尽管城市没有改变。此外,供应商现在在数据库中存在两次。
为什么AsNoTracking()
我使用AsNoTracking()
因为用户看到了真实实体。如果他改变某些东西,它会直接影响所有实体:将first_name设置为&#34; Peter&#34;所有条目都有&#34; Foo&#34; &#34;酒吧&#34;作为用户,然后有彼得&#34; &#34;酒吧&#34;作为用户。但只有修改后的实体才应该进行此更改。我认为这是因为我直接修改了&#34; real&#34;的成员变量。上下文中的实体。
问题
如何在不重新创建现有子实体的情况下重新附加修改后的实体。
OR
如何在不使用AsNoTracking()
答案 0 :(得分:0)
我正在尝试和你一样的事情,我不太清楚你的理解,但是这篇文章可能对你很有帮助。
https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
另外,我几乎可以肯定你不需要在你的例子中执行.Add(),这将导致大多数情况下出现新记录,或者如果适用则会出现“Unchanged”。
我可以通过附加和应用state = modified来实现将相同实体附加到新值,仍然研究如何重新附加相关属性(我最糟糕的问题是1toN关系)
在“将现有实体附加到上下文”下检查,可能会为您提供解决方案。
我也在代码项目中研究一篇有趣的帖子: https://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor
似乎这个家伙发明了一个扩展,可以在实体框架上重新附加节点图,例如“这里有你缺少EF的功能”。我试一试。
问候。