【问题标题】:Prevent updating unchanged value in ASP.NET MVC and Entity Framework防止更新 ASP.NET MVC 和实体框架中的未更改值
【发布时间】:2010-09-29 02:45:08
【问题描述】:

我正在使用 ASP.NET MVC 和实体框架。我有一个编辑人员网页,可以在其中编辑人员的字段,然后在回发操作中,我使用以下代码。

var person = objectCtx.Persons.Where(s => s.Id == id).FirstOrDefault();
TryUpdateModel(person, form.ToValueProvider());
objectCtx.SaveChanges();

效果很好。但是在生成的 SQL 中,即使值没有更改,我仍然可以看到 UPDATE 语句。有没有办法在 ASP.NET MVC 或实体框架中避免这种情况?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    好吧,如果你分配了一个属性,那么实体框架会假定你知道你在做什么并更新它。您是说用户只更改了一个字段,但我不确定 MVC 或实体框架应该如何知道,在 POSTed HTML 表单中的所有键值对中,用户实际上只更改了一个.在您的问题中,您是在说“值没有改变”,但是在您对@jchapa 的回答的 cmets 中,您说“并非所有信息都是相同的”。这表明实际问题不在于实体框架在做什么,而在于您告诉它做什么。

    我认为您可能在错误的地方寻找解决方案。

    如果您真正的问题是传递给操作的模型包含用户永远无法更改且永远不应该更新的字段(也许因为它们实际上根本不在表单上),那么您可以将白名单传递给TryUpdateModel.

    如果您的真正问题是另一个用户可能在用户对表单发出 GET 请求和用户发布她更改的时间之间更改了 Person 实例,那么您可以在表中添加一个 TIMESTAMP 字段并在其上设置固定并发模式。

    【讨论】:

      【解决方案2】:

      如果信息相同,您根本不能让它调用SaveChanges()

      【讨论】:

      • 但并非所有信息都相同。用户可能只更改了一个字段,但实体框架正在尝试更新 SQL 中的所有字段。
      • @Ian 以及为什么如果它是相同的数据它是相同的数据是一个问题
      • 问题是页面可能有多个子实体。例如,Person 实体和 Person.Address 子实体。如果用户只更新 Person 实体上的字段,就认为我们不应该更新 Person.Address 实体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2014-09-07
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多