2

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

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

欢迎任何关于这个问题的文章。

谢谢提前。

4

2 回答 2

8

ObjectContext 和 DbContext 不是线程安全的。请参阅http://msdn.microsoft.com/library/system.data.objects.objectcontext.aspx。如果您在像 ASP.NET 这样的多线程环境中使用它们,那么在使用单个实例时会遇到很大的麻烦。建议每个请求使用一个 ObjectContext。ObjectContext 必须在请求结束时处理。在 n 层 ASP.NET 应用程序中管理实体框架 ObjectContext 生命周期和范围的文章可能会有所帮助。

有没有可能,你误解了告诉你死锁的顾问?可能是他想警告您以错误方式使用 ObjectContext 时可能出现的死锁。

于 2012-06-14T13:48:20.677 回答
3

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

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

于 2012-06-12T08:05:35.063 回答