Mar*_*arv 5 c# entity-framework dbcontext entity-framework-6
我正在使用EF 6.1
模型
我有条目,包含一个本身包含城市的用户.该条目还有一个供应商.我用.AsNoTracking()检索我的条目:
return dbContext.Set<entry>()
.Include(x => x.user.city)
.Include(x => x.supplier).AsNoTracking().ToList();
Run Code Online (Sandbox Code Playgroud)
我有更多的属性,但它们都很相似.
视图
用户看到一个条目,可以更改所有属性的所有成员变量.他可以更改条目ID(而不是PrimaryKey).他可以更改用户的姓氏.他可以更改城市的名称或邮政编码.等等...
问题
想想这个例子:
条目:id = 123
user:first_name ="Foo",last_name ="Bar"
city:name ="FooCity",zip_code ="4711"
用户看到了这一点.他现在可以将first_name更改为"Peter"并单击"保存".然后我这样做:
dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry);
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified;
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
但是,EF重复了所有的孩子.所以在DB中我有一个新用户,如果用户还不存在,这可能就是我想要的.但是这个用户指向一个新的城市,尽管城市没有改变.此外,供应商现在在数据库中存在两次.
为什么 AsNoTracking()
我用过,AsNoTracking()因为用户看到了真实的实体.如果他改变某些东西,它会直接影响所有实体:将first_name设置为"Peter"所有以"Foo""Bar"为用户的条目,然后将"Peter""Bar"设置为用户.但只有修改后的实体才应该进行此更改.我认为这是因为我直接修改了上下文中"真实"实体的成员变量.
题
如何在不重新创建现有子实体的情况下重新附加已修改的实体.
要么
如何在不使用的情况下实现我想要的目标 AsNoTracking()
I\xc2\xb4m trying same thing as you, i\xc2\xb4m not sure to understand quite well your reasson thought, but probably this document will help you.
\n\nhttps://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
\n\n另外, i\xc2\xb4m 几乎可以肯定您不需要在示例中执行 .Add() ,这将在大多数情况下导致新记录,或者如果适用,则为“未更改”。
\n\n我可以通过附加和应用 state=modified 来实现将同一实体附加到新值,仍在研究如何重新附加相关属性(我最糟糕的问题是 1toN 关系)
\n\n检查“将现有实体附加到上下文”下,可能会为您带来解决方案。
\n\n我\xc2\xb4m还在代码项目中研究了一篇有趣的文章:\n https://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor
\n\n看来这个人发明了一个扩展来在实体框架上重新附加节点图,就像“这里有 EF 中缺少的功能”。我\xc2\xb4会尝试一下。
\n\n问候。
\n