【问题标题】:C# MVC saving only the changed elements of a view model with Entity FrameworkC# MVC 仅使用实体框架保存视图模型的更改元素
【发布时间】:2014-10-03 17:56:27
【问题描述】:

我有一个项目,其中多个用户可能同时查看同一页数据并对其进行更改。因此,会出现丢失更新的问题。

我想知道是否有任何框架或模式可以优雅地处理这个问题。因此,如果有人只更改视图模型中的一个字段,我只想更新数据库中的这一列。

目前我将视图模型发布回控制器,验证,然后自动映射到实体框架类。

作为一个恰当的例子,假设我的视图模型如下:

public class MyViewModel
{
    public int Id { get; set; }
    public int Num1 { get; set; }
    public int Num2 { get; set; }
}

数据库中只有1行如下:

Id = 1
Num1 = 10
Num2 = 20

然后在加载页面时将其读入视图模型。

如果 A 人和 B 人同时使用网站浏览到这条记录,他们的屏幕上将分别显示 10 和 20 的 Num1 和 Num2。

A 人将 Num1 设置为 15,然后按保存。

然后人员 B 将 Num2 更改为 25 并按保存。但是,由于保存了整个视图模型,因此人员 A 对 Num1 = 15 的更改会丢失并被人员 B 的记录中的 10 覆盖。

有没有人可以推荐任何 Web 框架,可以很好地使用 MVC 来避免这个问题?

【问题讨论】:

标签: asp.net-mvc entity-framework asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel


【解决方案1】:

最好的解决方案可能是在模型更新时使用 SignalR 之类的东西来更新其他用户的对象:http://signalr.net/

没有太多麻烦的更简单/粗略的实现可能会达到这种效果:

public class MyViewModel
{
    public int Id { get; set; }
    public int Num1 { get; set; }
    public int Num2 { get; set; }
    public int Num1Orig { get; set; }
    public int Num2Orig { get; set; }
}

在视图中包含 _Orig 作为隐藏字段。然后在您的帖子中,从数据库中获取当前对象,将新模型值与 _Orig 值进行比较,并且仅在实体对象发生更改时才更新它。

【讨论】:

  • 这是最后成功的数据持久性媒体的教科书答案。
【解决方案2】:

解决此问题的另一个方法是将您的系统从基于 CRUD 的系统中移除。

这些工具的一些示例:

命令架构/CQRS

事件溯源:

这是一篇关于事件溯源/CQRS http://simon-says-architecture.com/2011/01/15/probably-the-most-powerful-cqrsevent-sourcing-platform-in-net/ 的相当多的 101 篇文章,通过搜索这些概念,可以在此处找到有关这些主题的更多信息。

通过迁移到以这些为基础的架构,您将发送更集中的对象。你说 A 人更新 Num1 和 B 人更新 Num2,这些表明这些可能是离散的边界,你应该有一个单独的命令来更新 Num1 和 Num2。除非您打算在某个时候逐个字段地实施这些解决方案,否则您必须接受存在并发访问,除非通过人工参与的合并过程才能解决。

Num1 为 0,如果用户 A 将 Num1 更新为 5,而用户 B 将 Num 更新为 10,那么正确答案是什么?是5吗?是10吗?是15吗?只有人类才能确定这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2021-11-17
    相关资源
    最近更新 更多