使用嵌套子实体

时间:2017-05-12 05:51:46

标签: 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

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

的情况下实现我的目标

1 个答案:

答案 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的功能”。我试一试。

问候。