2012-06-12 100 views
2

我被警告不要在我的应用程序中使用实体框架的多个DBEntityContext。原因是由于并发访问数据库而导致死锁的风险。实体框架和DBContext问题

有人可以证实这一点吗?如果这是真的,为DBContext实现Singleton对象是一个好主意?

在这个问题上的任何文章是受欢迎的。

谢谢提前。

+0

你在说什么类型的应用程序? –

+0

Web应用程序 – CloudyMarble

回答

8

ObjectContext和DbContext不是线程安全的。见http://msdn.microsoft.com/library/system.data.objects.objectcontext.aspx。如果您在像ASP.NET这样的多线程环境中使用它们,则在使用单个实例时会遇到很大麻烦。建议每个请求使用一个ObjectContext。 ObjectContext必须在请求结束时处理。文章Managing Entity Framework ObjectContext lifespan and scope in n-layered ASP.NET applications可能会有帮助。

是否有可能,你错过了你的顾问谁告诉你有关死锁?也许他想警告你以错误的方式使用ObjectContext时可能出现的死锁。

3

在Web应用程序中,您必须为每个处理过的Web请求使用一个新的上下文实例,并在不再需要该实例之后处置该实例。上下文和与EF相关的任何东西都不是线程安全的。此外,它实现工作单元和身份映射模式,使other restrictions使用上下文实例。

死锁可能会发生,但这是您必须通过正确的事务设计来解决的问题。

+0

谢谢你的答案,良好的链接,但不创建一个新的上下文每个请求海岸更多性能比作为一个单身的应用程序生命周期的对象对吗? – CloudyMarble

+0

明白了,我只是读完了你的其他答案直到结束,它使得感觉,尽管如果表现可能是一个问题。 – CloudyMarble

+0

因此,我可以在ASP.NET MVC中为每个控制器创建一个上下文,并将其置于控制器处置位置? – Shimmy