【发布时间】:2012-10-25 12:36:39
【问题描述】:
我目前正在使用最新版本的 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 属性,并且该属性已更改并且在我的数据库和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 无法跟踪具有相同的多个对象 键
【问题讨论】:
标签: c# entity-framework ef-code-first