7

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

例如在 LINQ to Entities 中实例化上下文

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

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

提高实体框架性能

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

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

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

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

据我所知,这似乎加快了速度,没有任何错误。

但这安全吗?

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

最好的问候, 凯文

4

2 回答 2

7

EntityConnection 被记录为不是线程安全的。我认为您可以将它们汇集在一起​​,但您不能对 Web 应用程序使用单个静态连接,因为将涉及许多线程。

于 2010-04-05T15:35:49.310 回答
2
  • 如果您的 EF 上下文是应用程序范围的,请考虑用户 A 已进行更改(未提交)并且用户 B 已提交他的更改,所有更改都将提交到数据库,因为用户 A 和 B 都使用相同的实例

  • 在我的项目中,我对 EF 上下文进行了每个 WebRequest 实例 - 即。上下文对象从 Web 请求的开始到结束都是静态的,并且该请求中的所有操作都使用相同的 EF 上下文。在没有上述问题的情况下,这大大加快了我的处理速度。

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

HTH。

于 2010-04-04T18:46:22.487 回答