我正在使用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()