我目前正在使用最新版本的 Entity Framework 开发一个项目,但遇到了一个似乎无法解决的问题。
在更新现有对象时,我可以相当轻松地更新对象属性,直到涉及到一个引用另一个类的属性。
在下面的示例中,我有一个名为 Foo 的类,它存储各种属性,其中 2 个是其他类的实例
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
当我使用下面的Edit()
方法时,我传入了我希望更新的对象,并且我可以设法Name
正确更新,但是我还没有设法找到一种方法来改变 SubFoo 的属性。例如,如果SubFoo
该类具有 , 的属性Name
,并且该属性已更改并且在我的 DB 和 之间有所不同newFoo
,则它不会得到更新。
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry<Foo>(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
任何帮助或指示将不胜感激。
更新:根据 Slauma 的评论,我将方法修改为
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
context.Entry(dbFoo).CurrentValues.SetValues(newFoo);
context.Entry(dbFoo.SubFoo).CurrentValues.SetValues(newFoo.SubFoo);
context.SaveChanges();
return newFoo;
}
现在运行它时,我收到错误:
实体类型 Collection`1 不是当前上下文模型的一部分。
为了尝试解决这个问题,我添加了代码来尝试将newFoo
子类附加到上下文,但是这是通过一个错误说ObjectManager
已经有一个相同的实体:
ObjectStateManager 中已存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象