【问题标题】:Using statement in Entity Framework在实体框架中使用语句
【发布时间】:2013-05-10 22:41:34
【问题描述】:

我想问一下实体框架中的“使用”语句。正如我在其他论坛和书籍中多次看到的那样,当您使用以下代码(来自 ASP.NET MVC4 应用程序)查询数据库时,这是一个很好的做法:

using (var db = new ProductsEntites())
{
   var result = db.Products.ToList();
   return View(result);
}

但另一方面,如果我们使用脚手架来生成控制器方法和视图,则默认生成器正在声明

private ProductsEntites db = new ProductsEntites()

在控制器级别,因此在这种情况下,用于存储查询结果的内存仅在超时使用到期并且垃圾收集器为其他需要解锁内存时才被释放。那么什么对小网站更好,什么对大网站最好

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    您可以覆盖控制器的Dispose 方法。它应该在请求结束时调用。

        protected override void Dispose(bool disposing) {
            if(disposing)
                db.Dispose();
        }
    

    【讨论】:

    • 已经在这里了,默认生成如下代码:protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(处置); }
    【解决方案2】:

    拥有

    private ProductsEntites db = new ProductsEntites()
    

    作为一个类变量并在控制器中 Dispose 对我来说 Dispose 方法似乎很好。就像 Mehmet Ataş 指出的那样:

    protected override void Dispose(bool disposing) {
        if(disposing)
            db.Dispose();
    }
    

    控制器在动作执行后被释放。

    【讨论】:

    • 这就是我之前错过/不明白的:“控制器在执行操作后被释放。”感谢您的澄清
    • 虽然我们使用的是“Using”语句,但为什么我们需要处理它?我不明白,我一直认为“使用”自己会解决这个问题。感谢您的提示为我解决了一个问题。
    【解决方案3】:

    即使您不调用 Dispose 方法,实体框架也能正常工作(当您使用 using 语句时,您会隐式调用 Dispose 方法)。

    它工作得很好,因为 EF 使用了一个名为 Fly Weight 的设计模式。本质上,一条数据始终保留在内存中。这是因为EF在第一次执行服务器时有延迟,而当你杀死de aplication时有延迟。

    这样你就可以不用担心像脚手架模板一样使用代码了。

    【讨论】:

    • 我只是关心内存使用情况,如果有 100000 个用户来 :)
    【解决方案4】:

    注意使用 EF 的 using 语句,确保所有 IQueryable 返回都通过使用 ToList 或 ToArray 等将它们转换为 IEnumerable 来实现。

    如果你不这样做,延迟加载可以尝试访问上下文以在使用时获取一些导航属性,如果上下文被释放,你会抛出异常。

    【讨论】:

    • 这不是using语句的问题,这是EF的普遍问题。即使没有 using 语句也可能出现同样的问题,因为上下文可以在控制器被释放后的任何时间被释放。对 IQueryable 的任何引用都可能引发相同的异常。确实,这不太可能在单个请求的空间中发生,但有可能。 using 语句只是让它发生得更快。
    • 我总是按照 Julie Lermann 和其他专家的建议调用 .ToList()。我只是对您使用的是哪种方法感兴趣 - 默认是由脚手架生成的,还是您在每个操作中显式调用“使用”语句?
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多