在Console App退出C#之前,处置EF DBContext的重要性



我正在编写一个仅执行以下操作的简单控制台应用程序:
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方法。它是化妆品,可以帮助您更好地定义代码中的范围。

最新更新