Asp.net mvc C#MVC仅使用实体框架保存视图模型的更改元素

Asp.net mvc C#MVC仅使用实体框架保存视图模型的更改元素,asp.net-mvc,entity-framework,asp.net-mvc-4,viewmodel,asp.net-mvc-viewmodel,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Viewmodel,Asp.net Mvc Viewmodel,我有一个项目,多个用户可以同时查看同一页的数据,并对其进行更改。因此,将发生丢失更新问题 我想知道是否有任何框架或模式可以遵循,这将处理优雅。因此,如果有人只更改视图模型中的一个字段,我只想更新数据库中的这一列 目前,我将视图模型发布回控制器、验证,然后自动映射到实体框架类 作为一个恰当的示例,假设我的视图模型如下所示: public class MyViewModel { public int Id { get; set; } public int Num1 { get; se

我有一个项目,多个用户可以同时查看同一页的数据,并对其进行更改。因此,将发生丢失更新问题

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

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

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

public class MyViewModel
{
    public int Id { get; set; }
    public int Num1 { get; set; }
    public int Num2 { get; set; }
}
Id = 1
Num1 = 10
Num2 = 20
数据库中只有1行,如下所示:

public class MyViewModel
{
    public int Id { get; set; }
    public int Num1 { get; set; }
    public int Num2 { get; set; }
}
Id = 1
Num1 = 10
Num2 = 20
然后在加载页面时将其读入视图模型

如果人员A和人员B同时使用该网站浏览该记录,则其屏幕上的Num1和Num2分别为10和20

人员A将Num1设置为15,然后按save

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


是否有人可以推荐使用MVC的web框架来避免此问题?

最好的解决方案可能是在模型更新时使用类似Signal的东西来更新其他用户的对象:

一个没有太多麻烦的更简单/更粗糙的实现可能是这样的:

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作为隐藏字段包含在视图中。然后在文章中,从数据库中获取当前对象,将新模型值与原始值进行比较,并仅在实体对象发生更改时更新实体对象。

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

这些工具的一些示例:

指挥体系结构/CQRS

活动来源:

这里有一篇关于事件来源/CQR的101篇文章,通过搜索这些概念,可以在这里找到更多关于这些主题的信息

通过移动到构建在这些基础上的体系结构,您将发送更多聚焦对象。您提到了人员A更新Num1和人员B更新Num2,这表明这些可能是离散边界,您应该有一个单独的命令来更新Num1和Num2。除非您打算在某一点上逐个字段地实现这些解决方案,否则您必须接受,除了人工参与的合并过程之外,无法解决并发访问问题


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

您可以按照此链接中的建议进行操作。有任何建议解决了您的问题吗?没有,但一天晚上,一些进一步的研究发表了这篇有趣的文章:这是最后一个wins数据持久性介质的教科书答案。