Linq to sql 当暴露IQueryable时DataContext何时被释放?

Linq to sql 当暴露IQueryable时DataContext何时被释放?,linq-to-sql,repository-pattern,dispose,Linq To Sql,Repository Pattern,Dispose,正如目前流行的那样,如果将存储库实现为 IQueryable<T> FetchAll<T>(); IQueryable FetchAll(); 使用LINQ to SQL,存储库必须设置一个DataContext,该DataContext在存储库外部保持可用 所以我的问题是,如何处理DataContext? 如果存储库之外的代码生成了异常,该怎么办? 它会泄漏数据库连接吗 感谢使您的存储库实现IDisposable(并在释放存储库时释放DataContext)。现在,

正如目前流行的那样,如果将存储库实现为

IQueryable<T> FetchAll<T>();
IQueryable FetchAll();
使用LINQ to SQL,存储库必须设置一个DataContext,该DataContext在存储库外部保持可用

所以我的问题是,如何处理DataContext? 如果存储库之外的代码生成了异常,该怎么办? 它会泄漏数据库连接吗


感谢

使您的存储库实现IDisposable(并在释放存储库时释放DataContext)。现在,存储库的API类似于

using (var repository=new MyRepository) //or use a ServiceLocator or Factory
{
    var myObjects = repository.FetchAll().Where(obj=>obj.Foo == "bar");
    //do something with myObjects
}
现在,您的存储库将正确处理您的DataContext,世界上一切都很好。


摘要DataContext在调用查询时(当您访问数据时)打开连接,在查询结束时关闭连接。

嘿,Mike,我一直在想这种想法,但还没有在任何地方看到它。所有的书/博客等都直接使用IQueryable。使存储库IDisposable成为“已完成的事情”吗?看起来这是一个没有实际意义的问题。但是让你的存储库成为一次性的可以让你做一些技巧,比如保留ObjectContext,以便将新对象附加到它,以及创建事务。谢谢,这太棒了!!我知道我一定遗漏了一些东西,因为我从未见过任何公开IQueryable处理DataContext的示例