2017-05-12 50 views
5

我使用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 = “富”,姓氏= “酒吧”

city:name =“FooCity”,zip_code =“4711”

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

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

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

为什么AsNoTracking()

我已经使用AsNoTracking()因为用户看到真实实体。如果他改变了一些东西,它会直接影响所有实体:将first_name设置为“Peter”作为用户具有“Foo”“Bar”的所有条目,然后将“Peter”作为用户。但只有被修改的实体应该有这个改变。我认为这是因为我直接修改上下文中“真实”实体的成员变量。

问题

我怎样才能重新连接修改实体而无需重新创建现有的子实体。

OR

我如何能实现我想要的东西,而无需使用AsNoTracking()

+0

嗯,所以你的问题基本上是,你的修改对象的导航属性是未知的(分离),当对象被保存时,它们被视为新的条目。你在数据模型中使用外键属性吗? – grek40

+0

我尝试了两种。目前我有外键属性。 – Marv

+0

你可以明确地附加相关的实体或是通用的代码吗?我的意思是像'db.Entry(modifiedAndNotTrackedEntry).Reference(x => x.user).EntityEntry.State = EntityState.Unchanged'或'db.Entry(modifiedAndNotTrackedEntry.user).State = EntityState.Unchanged',对于其他属性。 – grek40

回答

0

我正尝试同样的事情,你,我不确定理解相当不错的reasson想法,但很可能将这个文件帮你。

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

此外,i'm几乎可以肯定,你鸵鸟政策需要执行。在你的例子中添加(),这将导致大多数情况下的新记录,或者如果应用,则为“未更改”。

我可以实现只通过连接和应用状态附加新的值相同的实体=修改,仍在研究如何重新连接相关的属性(我最糟糕的问题是1吨的关系)“连接下

检查现有的实体对上下文“,可能它会带给你一个解决方案。

I'm也在研究一个有趣的帖子在这里的代码项目: https://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor

看来这家伙发明了一个扩展的实体框架重新连接节点图,如“在这里你将有来自EF功能缺失“。我会试试看。

问候。