实体框架4 ObjectContext Lifetime

ace*_*ace 2 entity-framework

我刚开始使用EF4和存储库模式.我必须在每次使用上下文之后调用dispose方法或在using块中包装代码.我可以在我编写的每个方法中使用ObjectContext而不执行此操作,或者在存储库中有更好的方法来处理它.
另外,我也不想将UIContext从UI传递到存储库.

Tom*_*han 5

为了在没有依赖注入的情况下尽可能有效地执行此操作,我建议您为对象上下文实现私有的,延迟加载属性.

private ObjectContext _context;
private ObjectContext Context 
{ get 
    { 
        return _context ?? (_context = new ObjectContext()); 
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,使您的存储库实现IDisposable并处理dispose方法中的对象上下文:

public Repository : IDisposable
{
     ...
     public void Dispose()
     {
         _context.Dispose();
     }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需在所有方法中使用该属性,并在using语句中包含存储库的用法.

为了减少数据库的流量,您还可以将保存分解为存储库中的单独方法,该方法只是将调用转发给对象上下文.这样,你得到的更多的控制,当数据被保存在用户界面层,即使你不用管怎么样.这意味着你可以做到

using (var repo = new Repository())
{
    repo.AddSomeStuff("this", "is", true);
    repo.ChangeSomethingElse("yes, please");
    repo.Save();
}
Run Code Online (Sandbox Code Playgroud)

并且只有一次从EF到数据库的调用.另一方面,如果你这样做

using (var repo = new Repository())
{
    repo.AddSomeStuff("this", "is", true);
    repo.ChangeSomethingElse("yes, please");
}
Run Code Online (Sandbox Code Playgroud)

什么都没发生,这可能会令人困惑.