【问题标题】:How can entities be easily updated? (EF Code First, MVC3)如何轻松更新实体? (EF 代码优先,MVC3)
【发布时间】:2012-01-15 11:26:20
【问题描述】:

我以为我已经把这一切都弄清楚了,但我碰上了砖墙。

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

我试过了

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

但我收到“模型无法更新”异常。
所以我尝试了一种不同的方法,将 Recipe r 放入参数列表(并让模型绑定器完成工作)并调用

context.Recipes.Attach(r); 

但这会使事情保持“不变”,所以context.SaveChanges()什么都不做。

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

额外问题:如果我的实体有导航属性(集合),我显然会添加新发送的属性(使用ID == 0),但我怎么知道要删除哪个?我可以在此处使用 EF 的变更跟踪吗?

对于这两个问题:是否应该有一个神奇的“将此对象与此对象进行比较,然后保存”的方法?

【问题讨论】:

  • 这两个代码 sn-ps 有什么关系。你的问题看起来有点不一致。如果您只使用第一个 sn-p 并调用 SaveChanges 会发生什么?
  • 异常。 “无法更新模型”。
  • 有异常的细节吗?如果您使用预先加载来加载所有必须更新的关系会发生什么?

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


【解决方案1】:

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

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

EF 代码首先等同于ApplyOriginalValues:

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

【讨论】:

  • 我会继续写一个foreach (var p in obj.GetType().GetProperties()) 代码...
【解决方案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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 一半好。有些属性(如“已创建”)不需要更新。 CodeFirst 中是否有类似“ApplyOriginalValues”的方法?这会有帮助吗?
    • 我不确定是否有类似 dat 的东西...不过在这方面您可以做一件事...通过调用 var originalItem = yourContext.YourModel.Find(id) 加载原始对象,然后替换使用modifiedObj.Created = originalItem.Created ....最后调用EntityState.Modified
    • 我无法加载对象,而我正在尝试将实体的另一个副本附加到上下文。那是个例外。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多