30

我有一个关于 MVC 的项目。我们为我们的数据库事务选择了 EF。我们为 BLL 层创建了一些管理器。我找到了很多例子,其中using使用了“”语句,即

public Item GetItem(long itemId)
    {
        using (var db = new MyEntities())
        {
            return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
        }
    }

在这里,我们创建了一个 DBcontext 的新实例MyEntities()。我们使用“ using”是为了“确保正确使用 IDisposable 对象”。

这只是我经理的一种方法。但我有十多个。每次我从管理器调用任何方法时,我都会使用“ using”语句并在内存中创建另一个 DBcontext。垃圾收集器 (GC) 何时处理它们?有人知道吗?

但是管理器方法还有其他用法。我们创建一个全局变量:

private readonly MyEntities db = new MyEntities();

using并在没有“ ”语句的每个方法中使用 DBcontext 。方法如下所示:

public Item GetItem(long itemId)
{
    return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}

问题:

  1. 使用 DBcontext 变量的正确方法是什么?
  2. 如果我们不使用 " usage" 语句会怎样(因为它会影响性能) - GC 会为此做些什么?

我是 EF 使用方面的“新手”,但仍然没有找到这个问题的明确答案。

4

2 回答 2

14

我想你会发现很多人建议这种模式。不只是我或 Henk DBContext 处理

  • 是的,理想情况下使用 DBContext 子类型的语句
  • 使用 Using 管理的更好的工作单元模式,具有上下文并处理上下文许多 UoW 示例中的一个,这个来自 Tom Dykstra
  • 工作单元管理器应该是新的每个 Http 请求
  • 上下文不是线程安全的,因此请确保每个线程都有自己的上下文。
  • 让 EF 在幕后缓存东西。
  • 测试上下文创建时间。经过几次 Http 请求。你还有顾虑吗?
  • 如果您将上下文存储在静态中,则会出现问题。任何类型的并发访问都会受到伤害,如果您使用并行 AJAX 调用,假设使用静态单一上下文时出现问题的可能性为 90% 以上。

对于一些性能提示,非常值得一读

于 2013-07-30T12:24:33.767 回答
3

使用 DBContext 变量的正确或最佳实践方法是使用 Using。

    using (var db = new MyEntities())
    {
        return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
    }

好处是很多事情都是自动为我们完成的。例如,一旦代码块完成,就会调用 dispose。

根据MSDN EF 使用 DbContext

上下文的生命周期从创建实例时开始,到实例被释放或垃圾回收时结束。如果您希望将上下文控制的所有资源都放置在块的末尾,请使用 using。当你使用 using 时,编译器会自动创建一个 try/finally 块并在 finally 块中调用 dispose。

于 2015-11-09T19:00:19.567 回答