每个存储库一个ObjectContext vs每个方法

时间:2013-12-30 06:25:00

标签: c# .net asp.net-mvc entity-framework objectcontext

方法1

public class MyEntityRepository
{
private MyEntityContainer datacontext = new MyEntityContainer();

public IQuarable<VMModel1> Method1()
{
 //datacontext  used here in linq query

}

public IEnumerable<VMModel2> Method2()
{
 //datacontext  used here in linq query

}

}

方法2

public class MyEntityRepository
{


public IQuarable<VMModel1> Method1()
{
 using (var context = new MyEntityContainer())
{    
    // Perform data access using the context
}

}

public IEnumerable<VMModel2> Method2()
{
 using (var context = new MyEntityContainer())
{    
    // Perform data access using the context
}

}

}

我的问题是哪种方法更好,使用每种方法的利弊

1 个答案:

答案 0 :(得分:0)

实际上我更喜欢每个HTTP请求的ObjectContext 。每个请求的共享上下文解决了管理附加实体的问题。至于你只有一个上下文,你根本不用担心它。管理上下文范围更容易:在请求结束时只需SaveChanges和Dispose it。

以下是它的工作原理:

public abstract class AbstractRepository<T> where T : class
{
    /// <summary>
    /// Common context per request
    /// </summary>
    protected static ocm Context
    {
        get 
        { 
            if (HttpContext.Current != null)
            {
                var db = HttpContext.Current.Items["DbContext"] as MyObjectContext
                if (db == null)
                {
                    db = new MyObjectContext();
                    HttpContext.Current.Items.Add("DbContext", db);
                }
                return db;
            }
            return new MyObjectContext();
        }
    }

    public T Get(decimal id)
    {
        return Context.Set<T>().Find(id);
    }

    public virtual T Get(int id)
    {
        return Context.Set<T>().Find(id);
    }

    public List<T> GetAll()
    {
        return Context.Set<T>().ToList();
    }

    public void Add(T obj)
    {
        Context.Set<T>().Add(obj);
    }

    public void Remove(T obj)
    {
        Context.Set<T>().Remove(obj);
    }

    public void Attach(T obj)
    {
        Context.Set<T>().Attach(obj);
    }

    public void SaveChanges()
    {
        Context.SaveChanges();
    }
}

如果您对上下文的使用或处理有疑问,请与我们联系。