我正在编写一个仅执行以下操作的简单控制台应用程序:
1.查询数据库中的某些数据。
2.处理此数据。
3.更新数据库。
我编写了仅由主要方法组成的代码,如以下内容:
class Program
{
static void Main(string[] args)
{
try
{
var dbContext = new MyDatabaseContext();
var dbRecord = dbContext.MyTable.First(r => r.Status == 1);
// Do some work
dbRecord.Status = 2;
dbContext.SaveChanges();
}
catch(Exception)
{
// left empty
}
}
}
我的一位同事告诉我,我必须将代码包装在"使用"语句中,以关闭应用程序和数据库服务器之间的连接,如以下内容:
class Program
{
static void Main(string[] args)
{
try
{
using(var dbContext = new MyDatabaseContext())
{
var dbRecord = dbContext.MyTable.First(r => r.Status == 1);
// Do some work
dbRecord.Status = 2;
dbContext.SaveChanges();
}
}
catch(Exception)
{
// left empty
}
}
}
我知道在离开范围或不再需要对象之前处置"可置"对象的重要性,以避免内存泄漏并释放资源。
但是,在我的情况下,我的理解已经结束了,我不需要明确处理DBContext,因为应用程序结束后应用程序和数据库服务器之间不存在连接。
所以,我需要回答以下内容:
1.在我的情况下,重要的是要在程序退出之前处置dbcontext对象?
2.即使关闭程序后,连接仍然可以打开(通常是例外或用户关闭(?
3.如果我不使用"使用"语句,会发生什么?
,如果您提供官方参考的答案,我会很感激。
请注意,我关注的是内存和资源泄漏。数据丢失目前不关心。
回答您的3个问题:
- ef教程文档说:" ...在大多数常见的情况下,根本不称呼(隐式或明确(无害。"我不信任最常见的情况。这是最好的做法,我会的。通过这样做,您隐含地确保您的上下文使用的每个资源都可以正确发布,因为该框架的维护者这么说。
- 否,由于持有连接的对象存在于程序的内存中,因此没有打开连接。OS选择杀死该过程后,不再有指向该连接对象的指针。如果它仍在记忆中,它是无法到达的,因此它不存在。我不知道Windows是否实现了一些奇怪的全局连接汇总,但是,如果是的,那将是特定的,我永远不会依靠。
- 使用语句在将处置对象的末端定义了一个范围。因此,当达到使用块的末端时,它会隐式地调用Dispose方法。它是化妆品,可以帮助您更好地定义代码中的范围。