小编Mar*_*arv的帖子

使用嵌套子实体重新附加已修改的实体

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

c# entity-framework dbcontext entity-framework-6

5
推荐指数
1
解决办法
529
查看次数