在EF6和ASP.NET中同时使用多个DbContext实例

gil*_*gha 3 c# asp.net concurrency entity-framework dbcontext

我已经使用ASP.NET Web窗体和Entity Framework 6开发了一个Web应用程序。

我已经读到我应该为每个请求实例化一个新的DbContext实例(使用“ using”键),而不是尝试将其持久化。

现在,在所有需要查询数据库的地方,我都将实例化DbContext:

protected void Page_Load(object sender, EventArgs e)
{
    using(var tmcc = new TMCContext())
    {
        // querying tmcc entities and/or update them
        // ....

        tmcc.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果两个人同时加载页面怎么办?这意味着将有两个并发的DbContext实例。这不是问题吗?

感谢您的回答。

Pau*_*ner 5

在ASP.NET中,每个请求都在其自己的执行线程上进行处理。您在处理该请求的范围内创建的所有对象仅在该请求的范围内,除非您将对象明确地存储在共享位置(例如静态属性)。这意味着您的上下文将并排存在,而无需其他实例的知识:实体框架完全支持的方案。

并发更改数据的问题有些麻烦-可以想象,有两个用户同时对同一行数据进行更改。实体框架和SQL Server都会使这种情况发生。默认情况下,SQL Server将接受服务器接收更改的顺序。如果您有冲突的更改,即一组更改与另一组更改不兼容(例如,两个用户将“名称”字段更新为两个不同的值),则处理的更改最后“获胜”;这就是您将看到应用于冲突列的更改。

不幸的是,您想如何解决这些问题是一个很大的话题,在这里无法回答。这将取决于您的用户需求,而不是其他任何事情-让最后一次提交获胜可能是可以的,您可以走简单的路。否则,您将需要阅读一些有关该主题的内容。