管理EntityConnection生命周期

时间:2010-04-04 18:41:28

标签: c# .net asp.net entity-framework entityconnection

有很多关于管理 EntityContext 生命周期的问题,

e.g。 Instantiating a context in LINQ to Entities

我得出的结论是,实体上下文应该被视为工作单元,因此不能重复使用。大。

但是在进行一些加速我的数据库访问的研究时,我遇到了这篇博文......

Improving Entity Framework Performance

该帖子认为,与其他框架相比,EF的性能较差通常是由于每次需要新的 EntityContext 对象时都会创建 EntityConnection 对象。

为了测试这个,我在 Global.asax.cs Application_Start()中手动创建了一个静态EntityConnection。

然后我将所有上下文使用语句转换为

using( MyObjContext currContext = new MyObjeContext(globalStaticEFConnection)
{
   ....
}

到目前为止,这似乎已经加快了一些事情而没有任何错误。

但这样安全吗?

使用应用范围的静态 EntityConnection 会引入竞争条件吗?

祝你好运, Kervin

2 个答案:

答案 0 :(得分:7)

EntityConnection is documented to be not thread-safe。我认为你可以集中它们,但你不能为Web应用程序使用单个静态连接,因为会涉及很多线程。

答案 1 :(得分:2)

  • 如果您的EF上下文是应用程序范围的,请考虑用户A已进行更改(未提交)&用户B已经提交了他的更改,所有更改都将提交到数据库,因为用户A& B使用相同的实例

  • 在我的项目中,我根据EF上下文执行了一次WebRequest - 即。从Web请求的开始到结束,上下文对象是静态的。该请求中的所有操作都使用相同的EF上下文。这显着加快了我的处理速度,没有上述问题。

实现此目的的一种方法是使用DI容器(我使用Unity)来管理EF上下文的生命周期。每个Web请求生命周期管理器不是在Unity中开箱即用的,但是有大量的文章显示了如何做到这一点。

HTH。