Asp.net mvc 如何仅更新在MVC中更改的模型的属性?

Asp.net mvc 如何仅更新在MVC中更改的模型的属性?,asp.net-mvc,model-view-controller,entity-framework,Asp.net Mvc,Model View Controller,Entity Framework,我正在开发一个允许编辑记录的网络应用程序。有可能两个用户同时在同一屏幕上工作,如果他们都单击“保存”,我希望将造成的损害降至最低 如果User1请求该页面,然后更改地址、电话和联系人详细信息,但在单击Save之前,User2请求相同的页面 User1然后单击save,整个模型将使用TryUpdateModel()更新,如果User2只是在Notes字段中添加一些细节,则当他保存时,TryUpdateModel()方法将用旧细节覆盖User1保存的新细节 我考虑过将所有模型属性的原始值存储在一个隐

我正在开发一个允许编辑记录的网络应用程序。有可能两个用户同时在同一屏幕上工作,如果他们都单击“保存”,我希望将造成的损害降至最低

如果User1请求该页面,然后更改地址、电话和联系人详细信息,但在单击Save之前,User2请求相同的页面

User1然后单击save,整个模型将使用TryUpdateModel()更新,如果User2只是在Notes字段中添加一些细节,则当他保存时,TryUpdateModel()方法将用旧细节覆盖User1保存的新细节

我考虑过将所有模型属性的原始值存储在一个隐藏的表单字段中,然后编写一个定制的TryUpdateModel来只更新已更改的属性,但这感觉有点太像我们都非常乐意通过迁移到MVC而抛弃的Viewstate

有没有一种我不知道的处理这个问题的模式

你会怎么处理

更新:为了回答下面的评论,我使用的是实体框架


Anthony

在一个用户操作页面时锁定页面修改是一个选项。这是在一些wiki软件中完成的,比如dokuwiki。在这种情况下,它通常会使用一些javascript在5-10分钟不活动后释放锁,以便其他人可以更新它


另一个选项可能是将所有修订存储在数据库中,这样当两个用户提交时,两个副本都会保存并仍然存在。从那以后,你所需要做的就是将两者合并。

你通常不会处理这个问题。如果两个用户同时编辑一个文档并提交其更新,其中一个用户获胜,另一个用户失败

资源锁定可以通过有状态的桌面应用程序来完成,但对于web应用程序,您尝试实施的任何锁定方案都可能只会将损害降至最低,而不会阻止它


不要试图编写一个绝对完美和安全的应用程序。现在已经很好了。只要使用它,可能根本就不会出现这种情况。

除非您对这种情况下发生的事情有任何特殊要求(例如锁定记录,这当然需要一些功能来撤销锁定,以防用户决定不进行更改)。我建议正常的方法是乐观锁定:

您执行的每次更新都应检查记录在此期间是否没有更改

因此:

  • 在记录上放置整数“version”属性或guid/rowversion
  • 确保它包含在html中的隐藏字段中,并因此随任何提交一起返回
  • 执行更新时,请确保(数据库)记录的版本/guid/rowversion仍与隐藏字段中的值匹配[如果决定使用该手动方法,则在执行更新时将1添加到“版本”整数。]
  • 显然,类似的方法是在记录上使用日期/时间戳,但不要这样做,因为在系统时钟的精度范围内,它是有缺陷的


    [我建议您在其他地方可以找到关于整个方法的更全面的解释。当然,如果您要在谷歌上查找有关NHibernate版本功能的信息…]

    如果您使用LINQ to SQL作为ORM,它可以使用冲突集合处理围绕更改值的问题。不过,我基本上同意智囊团的意见。

    这可以在存储库/数据上下文级别处理。您使用什么样的数据库/数据访问方法?是的。。如果你告诉我们你在用什么ORM,我们可以帮你。。(例如Linq到SQL/实体),因为大多数ORM都有处理并发问题的方法。。这就是您所解释的。由于应用程序的性质,在某些情况下肯定会出现这种情况。