使用嵌套子实体重新附加已修改的实体

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()

Yog*_*rtu 0

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\n

https://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