【问题标题】:Entity Framework and DBContext Issues实体框架和 DBContext 问题
【发布时间】:2012-06-12 06:53:35
【问题描述】:

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

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

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

谢谢你。

【问题讨论】:

  • 你说的是哪种应用程序?

标签: c# .net-4.0 entity-framework-4 database-concurrency


【解决方案1】:

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 时可能会出现死锁。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答,良好的链接,但没有为每个请求创建一个新的上下文比将应用程序生命周期中的上下文对象作为单例具有更高的性能?
    • 知道了,我刚刚阅读了您的其他答案,直到最后,它是有道理的,即使性能可能是一个问题。
    • 那么我可以在 ASP.NET MVC 中为每个控制器创建一个上下文,并在控制器处处置它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多