C# Linq-to-Sql - 是否应该使用 IDisposable 处置 DataContext
-
03-07-2019 - |
题
我有几种处理数据库的方法,所有这些方法都从调用开始
FaierDbDataContext db = new FaierDbDataContext();
由于 Linq2Sql DataContext 对象实现了 IDisposable,这是否应该与“using”一起使用?
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
以一种或另一种方式使用它会产生什么影响?
解决方案
与大多数实现IDisposable的类型不同,DataContext实际上并不需要处置 - 至少在大多数情况下不是。我向马特·沃伦(Matt Warren)询问了这个设计决定,这是他的回答:
我们实施IDisposable有一些原因:
- 如果应用程序逻辑需要在预期使用DataContext或有效的情况下保留超出实体,则可以通过调用处置来执行该合同。该实体中的延期加载程序仍将引用DataContext,如果任何代码尝试导航延期属性,将尝试使用它。这些尝试将失败。处置还迫使数据台面倾倒其物有的实体的缓存,因此单个缓存的实体不会意外地使所有通过该数据台面实现的实体保持生命,否则将导致似乎是内存泄漏的。
- 可以自动关闭DataContext连接的逻辑可以被诱使连接打开。DataContext依赖于枚举的应用程序代码来枚举查询的所有结果,因为到达结果集的结束会触发关闭的连接。如果应用程序使用IEnumerable的Movenext方法,而不是C#或VB中的foreach语句,则可以过早退出枚举。如果您的应用程序经历连接未关闭的问题,并且您怀疑自动关闭行为不起作用,则可以将Dispose模式用作工作。
来自 来源
不隶属于 StackOverflow