EF(实体框架)使用"使用"语句

Pal*_*Pal 27 c# garbage-collection entity-framework using-statement dbcontext

我有一个关于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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里我们创建一个新的DBcontext实例MyEntities().我们使用" using"以"确保正确使用IDisposable对象".

这只是我经理中的一种方法.但我有十多个.每当我从管理器调用任何方法时,我将使用" using"statemant并在内存中创建另一个DBcontext.什么时候垃圾收集器(GC)会处理它们?谁知道?

但是还有另一种使用管理器方法的方法.我们创建一个全局变量:

private readonly MyEntities db = new MyEntities();
Run Code Online (Sandbox Code Playgroud)

并在没有" using"语句的每个方法中使用DBcontext .方法看起来像这样:

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

问题:

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

我是EF使用中的"新手",但仍然没有找到这个问题的明确答案.

phi*_*ady 13

我想你会发现许多暗示这种风格的模式.不只是我或Henk DBContext处理

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

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