c# - 为什么 WebApi Controller 运行后没有人处理 DbContext?

标签 c# .net entity-framework asp.net-mvc-4 asp.net-web-api

我知道各种教程以及针对 WebApiEntity Framework(甚至来自 Microsoft)的完整示例,它们具有 WebApi Controller ,例如这个:

public HttpResponseMessage GetInternet(int id) {
    var context = new InternetDbContext();
    var result =
       (from internet in context.Internets
        where internet.Id.Equals(id)
        select internet).FirstOrDefault();
    if(result != null)
       Request.CreateResponse(HttpStatusCode.OK, result);
}

但是当我在 2 年前了解 Entity Framework 时,我找到的关于该框架的每一个资源都指出了DISPOSE DbContex 是多么的重要 SHORTEST 可能的生命周期,例如使用“使用”。而如今,人们似乎对处置任何东西(他们的管理器、存储库、DI 容器......)都不屑一顾。

我是不是漏掉了什么? API 调用结束时是否会自动处理上下文?还是我必须使用来自 http://msdn.microsoft.com/en-us/library/dn153859(v=vs.118).aspxHttpRequestMessageExtensions.RegisterForDispose() 之类的东西? ?

最佳答案

就我个人而言,每当我看到类型实现 IDisposable 时,我几乎可以肯定在处理这种类型的新实例时我将使用 using 语句.

当变量超出范围时(就像在您的情况下,当执行从 GetInternet 方法返回时 context 变量超出范围),它的内存最终是将被垃圾收集器回收,但这并不意味着任何 native 处理程序(例如文件处理程序或数据库连接)将被关闭,这会对您的应用程序产生非常严重的负面影响。

因此,考虑始终IDisposable 包装到 using 结构中:

using (var context = new InternetDbContext())
{
  // Your code goes here
}

希望这对您有所帮助。

关于c# - 为什么 WebApi Controller 运行后没有人处理 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836837/

相关文章:

c# - 如何使用C#.net通过传递IP地址来获取设备信息

php - Symfony Doctrine 冲洗实体

c# - hunspell 拼写检查

c# - 为什么 BasicHttpBinding 不需要主体名称就可以在 IIS7 上使用 Kerberos Auth?

linq - 在 Entity Framework Where 子句中使用枚举

c# - 使用 LINQ to Entities 的外连接查询

c# 嵌套 for 循环检查比较列表中的每个元素返回奇数结果

c# - SqlDataAdapter.DeleteCommand() 适用于 AddWithValue() 但不适用于 Add() - 为什么?

c# - 正则表达式解析 Int 和 String

c# - ConfigurationManager.GetSection(sectionName) 在执行单元测试时返回 null