我写了几个使用Entity Framework的应用程序。我过去常常使用using子句。通过这个子句,我确信数据库连接会被正确关闭。
但是,在某些情况下,我的数据库上下文对象是一个类的字段。它的实例化在声明中完成,没有使用using子句。
我刚刚发现,在这种情况下,Dispose()方法不会被调用。使用using子句时,Dispose()会自动调用。
所以我的问题是: 如果在数据库上下文上没有调用Dispose()会发生什么?析构函数将被调用,因此您认为数据库会被析构函数关闭吗?还是应该在容器对象的析构函数中手动调用Dispose(),像这样:
但是,在某些情况下,我的数据库上下文对象是一个类的字段。它的实例化在声明中完成,没有使用using子句。
我刚刚发现,在这种情况下,Dispose()方法不会被调用。使用using子句时,Dispose()会自动调用。
所以我的问题是: 如果在数据库上下文上没有调用Dispose()会发生什么?析构函数将被调用,因此您认为数据库会被析构函数关闭吗?还是应该在容器对象的析构函数中手动调用Dispose(),像这样:
class MyClass
{
public MyDbContext ctx = new MyDbContext();
....
~MyClass()
{
ctx.Dispose();
}
}
谢谢
try,finally
块内隐式发生。当你显式使用时,情况就不同了。这就是为什么不建议显式调用dispose
。没有保证。 - SampathDbContext.Dispose
。关于隐式与显式的所有其他内容都只是你个人的观点。调用任何可处理对象的Dispose
方法显式地多次也没有问题。 - Ivan StoevDbContext
场景时,可能会错过separate
或explicit
的Dispose
语句,尤其是在之前发生异常的情况下。这就是为什么它不好。没有关于这个的保证。@IvanStoev - Sampath