Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用嵌套的子实体重新附着修改的实体_C#_Entity Framework_Entity Framework 6_Dbcontext - Fatal编程技术网

C# 用嵌套的子实体重新附着修改的实体

C# 用嵌套的子实体重新附着修改的实体,c#,entity-framework,entity-framework-6,dbcontext,C#,Entity Framework,Entity Framework 6,Dbcontext,我使用的是EF6.1 型号 我有一些条目,其中包含一个用户,该用户本身包含一个城市。该条目还包含一个供应商。 我使用.AsNoTracking()检索我的条目: 返回dbContext.Set() .Include(x=>x.user.city) .Include(x=>x.supplier).AsNoTracking().ToList(); 我有更多的财产,但他们都是相似的 查看 用户看到一个条目,可以更改所有属性的所有成员变量。他可以更改条目id(而不是主密钥)。他可以更改用户的姓氏。他可

我使用的是EF6.1

型号

我有一些条目,其中包含一个用户,该用户本身包含一个城市。该条目还包含一个供应商。 我使用.AsNoTracking()检索我的条目:

返回dbContext.Set()
.Include(x=>x.user.city)
.Include(x=>x.supplier).AsNoTracking().ToList();
我有更多的财产,但他们都是相似的

查看

用户看到一个条目,可以更改所有属性的所有成员变量。他可以更改条目id(而不是主密钥)。他可以更改用户的姓氏。他可以更改城市的名称或邮政编码。等等

问题

想想这个例子:

条目:id=123

用户:first_name=“Foo”,last_name=“Bar”

城市:name=“FooCity”,邮政编码=“4711”

用户看到了这一点。他现在可以将名字改为“Peter”,然后单击保存。然后我就这样做了:

dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry);
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified;
dbContext.SaveChanges();
dbContext.Set();
Entry(ModifiedNotTrackedEntry).State=EntityState.Modified;
dbContext.SaveChanges();
但EF会复制所有子实体。因此在DB中我有一个新用户,如果用户还不存在,这可能是我想要的。但是这个用户指向一个新的城市,尽管这个城市没有改变。此外,该供应商现在在数据库中存在两次

为什么
AsNoTracking()

我使用了
AsNoTracking()
,因为用户看到了真实的实体。如果他更改了某些内容,则会直接影响所有实体:将first_name设置为“Peter”,所有以“Foo”“Bar”作为用户的条目,然后以“Peter”“Bar”作为用户。但只有修改过的实体才应该有此更改。我认为这是因为我在上下文中直接修改了“real”实体的成员变量

问题

如何在不重新创建现有子实体的情况下重新附着修改后的实体


如果不使用
AsNoTracking()

我怎么能实现我想要的呢?我正在尝试与您相同的事情,我不确定是否完全理解您的重新思考,但本文档可能会对您有所帮助

此外,我几乎可以肯定,在您的示例中,您不需要执行.Add(),这将导致大多数情况下出现新记录,或者如果适用,则会出现“未更改”的情况

我可以通过附加和应用state=modified来实现用新值附加同一实体,但仍在研究如何重新附加相关属性(我最糟糕的问题是1toN关系)

选中“将现有实体附加到上下文”下的复选框,它可能会为您提供一个解决方案

我还在代码项目中研究一个有趣的帖子:

这家伙似乎发明了一个扩展,可以在实体框架上重新附加节点图,比如“这里有EF缺少的特性。”我来试试


关于。

Hmm,因此您的问题基本上是,您修改的对象的导航属性是未知的(分离的),当对象被保存时,它们被视为新条目。是否在数据模型中使用外键属性?我尝试了这两种方法。目前我有外键属性。你能明确地附加相关的实体吗?或者代码是通用的吗?我的意思是像
db.Entry(modifiedNotTrackedEntry).Reference(x=>x.user).EntityEntry.State=EntityState.Unchanged
db.Entry(modifiedNotTrackedEntry.user).State=EntityState.Unchanged
,其他属性也一样。我认为这是不可能的。我有太多的财产,然后我必须检查每一个财产,如果它被改变。为什么这是如此困难和丑陋?我做的事情真的很疯狂吗?我不敢相信我是唯一一个这样做的人。
dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry);
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified;
dbContext.SaveChanges();