我目前正在使用最新版本的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无法使用相同的键跟踪多个对象
3 回答
您也可以单独调用表
CurrentValues.SetValues
仅更新标量属性但不更新相关实体,因此您必须对每个相关实体执行相同操作:如果关系可能已完全删除或已创建,您还需要明确处理这些情况:
如果关系已更改,则最终还需要将附加实体的状态设置为
Modified
以及标量属性 .Edit
如果 - 根据你的评论 -
Foo.SubFoo
实际上是一个集合,而不仅仅是一个参考,你需要这样的东西来更新相关的实体:只是想我会发布下面的链接,因为它真的帮助我了解如何更新相关实体 .
Updating related data with the entity framework in an asp net mvc application
注意:我确实稍微更改了UpdateInstructorCourses函数中显示的逻辑以满足我的需要 .