首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架4 ObjectContext生命周期

实体框架4 ObjectContext生命周期
EN

Stack Overflow用户
提问于 2010-07-29 20:11:41
回答 2查看 4.1K关注 0票数 2

我刚刚开始在存储库模式中使用EF4。每次在using块中使用上下文或包装代码后,我都必须调用dispose方法。我是否可以在我编写的每个方法中使用ObjectContext而无需执行此操作,或者是否有更好的方法在存储库中处理此问题。

此外,我也不想将ObjectContext从UI传递到存储库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-29 20:27:34

使用对象上下文的一般模式是:

代码语言:javascript
复制
public BusinessObject GetSomething(){
   using (MyObjectContext context = new MyObjectContext()){
      //..do fun stuff
   }

}

希望这就是您正在使用的模式。当您只能使用"using“语句时,调用dispose似乎有点夸张。

另一种选择是,如果您要在一个流中执行多个DB查询。我见过一种模式,您可以在线程中重用相同的上下文。人们基本上实现了一个基于线程的单例模式,并传递上下文。这样做的好处是不必重新构建上下文,以及在内存缓存中的一些优点。缺点是你可能会遇到并发问题。有人更新了你在EF内部缓存的内容。

我猜第二种情况并不适用,因为它听起来像是你在写一个小应用。(这句话是基于你关于从UI传递上下文的评论……这句话会吓到任何优秀的代码架构师)。

如果你对基于线程的单例感兴趣。首先学习Singleton模式,然后查看这个关于"DataContext“线程的blog。您必须将"DataContext“类型更改为ObjectContext类,但这是可行的。

编辑

我会说我忽略了一个显而易见的解决方案,那将是下面的;)只需使用基于属性的对象上下文,并在using语句中播放您的存储库。它将与上面的使用示例相同,但您将实现IDisoposable。

票数 2
EN

Stack Overflow用户

发布于 2010-07-29 20:23:42

为了在没有依赖注入的情况下尽可能有效地做这件事,我建议你为对象上下文实现一个私有的、延迟加载的属性。

代码语言:javascript
复制
private ObjectContext _context;
private ObjectContext Context 
{ get 
    { 
        return _context ?? (_context = new ObjectContext()); 
    }
}

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

代码语言:javascript
复制
public Repository : IDisposable
{
     ...
     public void Dispose()
     {
         _context.Dispose();
     }
}

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

为了减少到数据库的流量,您还可以将保存排除在存储库上的一个单独方法中,该方法只将调用转发到对象上下文。这样,您就可以更好地控制何时在UI层中保存数据,即使您无法控制如何保存数据。这意味着你可以这样做

代码语言:javascript
复制
using (var repo = new Repository())
{
    repo.AddSomeStuff("this", "is", true);
    repo.ChangeSomethingElse("yes, please");
    repo.Save();
}

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

代码语言:javascript
复制
using (var repo = new Repository())
{
    repo.AddSomeStuff("this", "is", true);
    repo.ChangeSomethingElse("yes, please");
}

什么都没有发生,这可能会让人感到困惑。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3362280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档