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

本文关键字:DbContext 实例 EF6 ASP NET | 更新日期: 2023-09-27 18:01:59

我用ASP开发了一个web应用程序。. NET Web Forms和实体框架6.

我读到我应该为每个请求实例化DbContext的新实例(使用键work"using"),而不是试图持久化它。

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

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

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

谢谢你的回答

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

NET中,每个请求都在自己的执行线程中处理。在处理该请求的作用域中创建的所有对象都只在该请求的作用域中,除非您显式地将对象存储在共享位置,如静态属性。这意味着你的上下文将肩并肩地存在,而不需要任何其他实例的知识:一个完全由实体框架支持的场景。

并发更改数据的问题在某种程度上更有问题——您可以想象有两个用户同时更改同一行数据。实体框架和SQL Server都可以实现这一点。默认情况下,SQL Server将按照服务器接收到的顺序接受这两个更改。如果您有冲突的更改,即一组更改与另一组更改不兼容(例如,两个用户将"Name"字段更新为两个不同的值),最后处理的更改"获胜";这就是您将看到的应用于冲突列的更改。

不幸的是,如何解决这些问题是一个相当大的话题,太大了,无法在这里回答。这取决于您的用户需求,而不是其他任何事情——让最后一次提交获胜可能是可以的,这样您就可以走捷径了。否则,您将不得不围绕该主题进行一些阅读。

我很确定,如果多个用户同时访问您的页面,DbContext并发性不会有问题。但是,您可能会遇到逻辑并发问题,因为一个用户可能会在不知情的情况下覆盖另一个用户的数据。在这种情况下你应该怎么做完全取决于你的应用程序的逻辑。

顺便说一句,我建议你每个HttpRequest实例化一个DataContext并在任何地方使用它,并在请求结束时处理它。可以挂接全局中的Begin Request事件。asax做那个,然后把请求放到request中。项或其他地方(不是静态字段!),或者您可以正确地使用IoC容器库并让它为您创建一个具有每个请求生命周期的DataContext。

使用Linq。您需要使用DbSet

向您的上下文中添加模型

DbSet project {get;设置;}

然后你可以从数据库中获取数据

tmcc.projects.tolist ();