Entity framework ASP.NET Web API中DbContext的推荐生命周期?

Entity framework ASP.NET Web API中DbContext的推荐生命周期?,entity-framework,asp.net-web-api,Entity Framework,Asp.net Web Api,考虑一个ASP.NETWebAPI2应用程序,它使用EntityFramework提供对多个DB表的相当直接的访问 以下哪种对象生命周期选项在服务最多并发请求方面最好 实例化所有请求都要使用的单例DbContext 为每个传入请求实例化一个DbContext 为线程池中服务传入请求的每个线程实例化一个DbContext 其他的 后续问题-如果我将需求更改为“需要最少的DB服务器资源”,该怎么办?那么最好的选择是什么?基于另一个问题: 我问题中的选项1和3完全无效。原因是DbContext不是线程

考虑一个ASP.NETWebAPI2应用程序,它使用EntityFramework提供对多个DB表的相当直接的访问

以下哪种对象生命周期选项在服务最多并发请求方面最好

  • 实例化所有请求都要使用的单例DbContext
  • 为每个传入请求实例化一个DbContext
  • 为线程池中服务传入请求的每个线程实例化一个DbContext
  • 其他的
  • 后续问题-如果我将需求更改为“需要最少的DB服务器资源”,该怎么办?那么最好的选择是什么?

    基于另一个问题:

    我问题中的选项1和3完全无效。原因是DbContext不是线程安全的,多线程访问会带来不一致的数据状态并引发异常。即使是在“每个线程”的情况下,ASP.NET Web API也可能会在多个线程之间任意转移对单个请求的处理


    选项2(为每个传入请求实例化一个DbContext)是首选方法,因为它确保一次只有一个线程可以访问DbContext。

    除了不具有线程安全性之外,DbContext不应该存在很长时间。所以你必须使用2。(甚至每个Db操作都有一个DbContext实例)

    如果您的“相当直接地访问几个DB表”非常简单,我建议您使用OData和一些高级js客户端,如breeze.js

    请访问以下网站:

    • 这将数据公开为一个简单的REST服务
    • 该库提供高级js功能,类似于DbContext提供的功能,但在浏览器端:语法类似于LINQ,本地(浏览器)数据缓存

    您还可以直接使用OData服务(例如使用jQuery AJAX)或使用更简单的库(datajs、JayData)

    明确的最佳实践是(2)。搜索此主题,您将找到讨论。谢谢。是否愿意将您的评论提升为带有解释的答案?:)我不想重复现有的信息:而且,在解释答案时要小心。当您将1和3作为长时间运行的上下文管理时,它们同样糟糕。但是如果一个请求产生多个线程,那么每个线程可能需要一个新的上下文。但没有长时间运行的上下文。如果每个请求只使用一个新上下文,而一个请求执行并行任务,则并行线程可能会损坏主进程中保存的上下文。并行搜索。我个人确保每个线程有一个短期上下文。因此,在最初的问题中,选择2b;-)