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