实体框架通用存储库上下文

时间:2010-09-22 03:19:11

标签: entity-framework asp.net-mvc-2 repository-pattern

我正在使用基于this blog post的通用存储库构建ASP.NET 4.0 MVC 2应用程序。

我不确定如何处理ObjectContext的生命周期 - 这是我的存储库类的典型方法:

public T GetSingle<T>(Func<T, bool> predicate) where T : class
{
    using (MyDbEntities dbEntities = new MyDbEntities())
    {
        return dbEntities.CreateObjectSet<T>().Single(predicate);
    }
}

MyDbEntities是实体框架4生成的ObjectContext

  1. 是否可以根据每个HTTP请求调用.CreateObjectSet()并创建/ dispose MyDbEntities?如果没有,我该如何保留这个对象?
  2. 如果另一个方法使用类似的代码返回IEnumerable<MyObject>,如果我尝试在该方法范围之外执行CRUD操作,这是否会导致未定义的行为?

1 个答案:

答案 0 :(得分:4)

是的,可以在每个请求上创建一个新的对象上下文(并依次调用CreateObjectSet)。事实上,它是首选。和任何实现IDisposable的对象一样,你应该是一个好公民并处理它(你上面的代码正在做)。有些人使用IoC来控制作用于http请求的对象上下文的生命周期,但不管怎样,它都是短暂的。

对于你问题的第二部分,我想你在问另一种方法是否使用不同的数据上下文实例执行CRUD操作(如果我误解,请告诉我)。如果是这种情况,则需要将其附加到将执行实际数据库更新的新数据上下文。这是一件好事。另外,可以接受的是使用工作单元模式。