我以为我已经弄明白这一切,但我碰到了一堵砖墙。
客户端发送一个对象,我的控制器检查用户是否有权编辑,然后继续更新数据库中的实体。 (以及对象具有的任何导航属性) 我的问题是,我似乎无法让它发挥作用......
我试过
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的变更跟踪吗?
对于这两个问题:是否应该有魔法"将此对象与此对象进行比较,然后保存"方法
答案 0 :(得分:3)
回答你的问题是非常不受欢迎的。 EF对此没有任何支持。 EF只能同步没有导航属性的简单对象的状态。一旦必须同步关系中的更改(如添加或删除的相关实体),您必须执行此操作completely manually - 特别是删除需要此操作,或者您必须在客户端的单独集合中设置已删除的关系,并在附加实体上复制删除这非常麻烦
由于workaround人使用来自MVC的TryUpdateModel
或UpdateModel
来执行导航属性的更改,但在这种情况下,您无法对更新过程提出任何其他要求。简单的旧值将被来自客户端的新值覆盖。
EF代码首先等同于ApplyOriginalValues
:
context.Entry(attachedEntity).OriginalValues.SetValues(detachedEntity);
答案 1 :(得分:2)
有关处理导航属性更新的问题,请参阅本教程的向教师编辑页面添加课程作业部分:
答案 2 :(得分:1)
尝试使用EntityState代替Update模型,如下所示,看看是否有帮助
context.Entry(obj).State = EntityState.Modified;
db.SaveChanges();