我正在开发一个允许编辑记录的网络应用程序。两个用户有可能同时在同一屏幕上工作,如果他们都单击“保存”,我希望将造成的损害降到最低。
如果用户 1 请求该页面,然后更改地址、电话和联系方式,但在单击“保存”之前,用户 2 请求同一页面。
然后,User1 单击“保存”,并使用 TryUpdateModel() 更新整个模型,如果 User2 只是将一些详细信息附加到 Notes 字段,则当他保存时,TryUpdateModel() 方法将使用旧详细信息覆盖 User1 保存的新详细信息.
我考虑过将所有模型属性的原始值存储在隐藏的表单字段中,然后编写自定义的 TryUpdateModel 来仅更新已更改的属性,但这感觉有点太像我们所有的 Viewstate我很高兴能够离开并转向 MVC。
是否有我不知道的处理此问题的模式?
你会如何处理?
更新:为了回答下面的评论,我正在使用 Entity Framework 。
安东尼
最佳答案
除非您对这种情况下发生的情况有任何特殊要求(例如锁定记录,这当然需要一些功能来在用户决定不进行更改的情况下撤消锁定),否则我建议使用正常的方法是乐观锁:
您执行的每次更新都应检查记录是否同时发生更改。
所以:
- 在记录中放置一个整数“版本”属性或 guid/rowversion。
- 确保它包含在 html 的隐藏字段中,因此会随任何提交一起返回;
- 执行更新时,请确保(数据库)记录的版本/guid/rowversion 仍然与隐藏字段中的值匹配[如果您执行更新,则在执行更新时将“版本”整数加 1决定采用手动方法。]
类似的方法显然是在记录上使用日期/时间戳,但不要这样做,因为在系统时钟的精度范围内,它是有缺陷的。
[我建议您在其他地方找到整个方法的更完整的解释。当然,如果您要通过 google 搜索有关 NHibernate 版本功能的信息...]
关于asp.net-mvc - 如何仅更新 MVC 中已更改的模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878245/