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

时间:2014-08-24 15:59:07

标签: entity-framework asp.net-web-api

考虑一个ASP.NET Web API 2应用程序,它使用Entity Framework提供对几个数据库表的相当直接的访问。

在为大多数并发请求提供服务方面,对象生命周期的以下哪个选项最佳?

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

2 个答案:

答案 0 :(得分:1)

基于a detailed reply基于另一个问题:

我的问题中的选项1和3完全无效。原因是DbContext不是线程安全的,并且具有多个线程访问将带来不一致的数据状态并抛出异常。即使是在每个线程中也是如此#34;在这种情况下,ASP.NET Web API可能会在几个线程之间随意转移单个请求的处理。

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

答案 1 :(得分:0)

除了不是线程安全之外,DbContexts不应该长寿。所以你必须使用2.(或者每个Db操作甚至一个DbContext实例)。

如果你“非常直接访问几个数据库表”非常简单,我建议你使用OData和一些高级js客户端,比如breeze.js。

请看这个网站:

  • ASP.NET Web API OData这将数据公开为简单的REST服务
  • breeze.js此库提供高级js功能,类似于DbContext提供的功能,但在浏览器端:语法类似于LINQ,本地(浏览器)数据缓存......

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