重新连接嵌套子实体修改实体
我使用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()
我正尝试同样的事情,你,我不确定理解相当不错的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功能缺失“。我会试试看。
问候。
嗯,所以你的问题基本上是,你的修改对象的导航属性是未知的(分离),当对象被保存时,它们被视为新的条目。你在数据模型中使用外键属性吗? – grek40
我尝试了两种。目前我有外键属性。 – Marv
你可以明确地附加相关的实体或是通用的代码吗?我的意思是像'db.Entry(modifiedAndNotTrackedEntry).Reference(x => x.user).EntityEntry.State = EntityState.Unchanged'或'db.Entry(modifiedAndNotTrackedEntry.user).State = EntityState.Unchanged',对于其他属性。 – grek40