2

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

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

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

private ProductsEntites db = new ProductsEntites()

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

4

4 回答 4

4

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

    protected override void Dispose(bool disposing) {
        if(disposing)
            db.Dispose();
    }
于 2013-05-10T12:15:07.690 回答
2

private ProductsEntites db = new ProductsEntites()

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

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

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

于 2013-05-10T14:41:34.967 回答
1

即使您不调用 Dispose 方法(当您使用using语句时,您隐式调用 Dispose 方法),实体框架也是开发人员可以正常工作的。

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

所以你可以像脚手架模板一样使用代码而不用担心。

于 2013-05-10T12:11:50.350 回答
0

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

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

于 2013-05-10T13:41:05.583 回答