我有几种处理 DB 的方法,它们都从调用开始
FaierDbDataContext db = new FaierDbDataContext();
既然 Linq2Sql DataContext 对象实现了 IDisposable,这应该和“using”一起使用吗?
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
以一种或另一种方式使用它有什么影响?
我有几种处理 DB 的方法,它们都从调用开始
FaierDbDataContext db = new FaierDbDataContext();
既然 Linq2Sql DataContext 对象实现了 IDisposable,这应该和“using”一起使用吗?
using (FaierDbDataContext db = new FaierDbDataContext()) {
// use db here
}
以一种或另一种方式使用它有什么影响?
与大多数实现 IDisposable 的类型不同,DataContext 并不真正需要处理 - 至少在大多数情况下不需要。我向马特沃伦询问了这个设计决定,这是他的回答:
我们实施 IDisposable 有几个原因:
- 如果应用程序逻辑需要在预期使用或有效 DataContext 之后保留实体,则可以通过调用 Dispose 来强制执行该合同。该实体中的延迟加载程序仍将引用 DataContext,并且如果任何代码尝试导航延迟属性,则将尝试使用它。这些尝试都会失败。Dispose 还强制 DataContext 转储其物化实体的缓存,以便单个缓存实体不会意外地使通过该 DataContext 物化的所有实体保持活动状态,否则会导致看似内存泄漏的情况。
- 自动关闭 DataContext 连接的逻辑可能会被欺骗,使连接保持打开状态。DataContext 依赖于枚举查询的所有结果的应用程序代码,因为到达结果集的末尾会触发连接关闭。如果应用程序使用 IEnumerable 的 MoveNext 方法而不是 C# 或 VB 中的 foreach 语句,则可以提前退出枚举。如果您的应用程序遇到连接未关闭的问题并且您怀疑自动关闭行为不起作用,您可以使用 Dispose 模式作为解决方法。
从源头