如何轻松更新实体? (EF Code First,MVC3)

时间:2012-01-15 11:26:20

标签: asp.net-mvc-3 entity-framework ef-code-first crud

我以为我已经弄明白这一切,但我碰到了一堵砖墙。

客户端发送一个对象,我的控制器检查用户是否有权编辑,然后继续更新数据库中的实体。 (以及对象具有的任何导航属性) 我的问题是,我似乎无法让它发挥作用......

我试过

var obj = context.Recipes.SingleOrDefault(o=>o.ID == id);
UpdateModel(obj);

但我有一个"模型无法更新"例外。
所以我尝试了一种不同的方法,将Recipe r放入参数列表(让模型绑定器完成工作)并调用

context.Recipes.Attach(r); 

但是事情已经开始了#34;未改变",所以context.SaveChanges()什么都不做。

是否有一个简单的解决方案,我不必为我的对象上的每个属性写obj.SomeProperty = r.SomeProperty

奖金问题:如果我的实体有导航属性(收藏),我显然会添加新的(ID == 0),但我怎么知道要删除哪一个?我可以在这里的某处利用EF的变更跟踪吗?

对于这两个问题:是否应该有魔法"将此对象与此对象进行比较,然后保存"方法

3 个答案:

答案 0 :(得分:3)

回答你的问题是非常不受欢迎的。 EF对此没有任何支持。 EF只能同步没有导航属性的简单对象的状态。一旦必须同步关系中的更改(如添加或删除的相关实体),您必须执行此操作completely manually - 特别是删除需要此操作,或者您必须在客户端的单独集合中设置已删除的关系,并在附加实体上复制删除这非常麻烦

由于workaround人使用来自MVC的TryUpdateModelUpdateModel来执行导航属性的更改,但在这种情况下,您无法对更新过程提出任何其他要求。简单的旧值将被来自客户端的新值覆盖。

EF代码首先等同于ApplyOriginalValues

context.Entry(attachedEntity).OriginalValues.SetValues(detachedEntity);

答案 1 :(得分:2)

有关处理导航属性更新的问题,请参阅本教程的向教师编辑页面添加课程作业部分:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

答案 2 :(得分:1)

尝试使用EntityState代替Update模型,如下所示,看看是否有帮助

context.Entry(obj).State = EntityState.Modified;
db.SaveChanges();