繁体   English   中英

在C#中退出控制台应用程序之前处理EF DbContext的重要性

[英]Importance of disposing EF DbContext before the console app exits in C#

我正在编写一个仅执行以下操作的简单控制台应用程序:
1.在数据库中查询一些数据。
2.处理此数据。
3.更新数据库。

我编写了仅包含Main方法的代码,如下所示:

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
       }  
    }
}

我知道在离开范围或不再需要该对象之前,布置“ IDisposable”对象的重要性,以避免内存泄漏和释放资源。

但是我的理解是,就我而言,该程序已经结束,并且我不需要显式处理DbContext,因为在应用程序结束后,该应用程序与数据库服务器之间将不存在任何连接。

因此,我需要回答以下问题:

1.就我而言,在程序退出之前放置DbContext对象是否重要?
2.即使关闭程序后,连接是否仍会打开(通常是例外情况,或者由用户关闭)?
3.如果我不使用“ using”语句会怎样?

如果您提供带有官方参考的答案,我将不胜感激。

请注意,我担心的是内存和资源泄漏。 目前,我不关心数据丢失。

要回答您的3个问题:

  • EF教程文档说:“ ...在大多数情况下,完全不(隐式或显式)调用Dispose也无害。” 我不相信最常见的情况。 这样做是一种最佳实践,我会的。 通过这样做,您可以隐式地确保上下文所使用的每个资源都已正确释放,因为此框架的维护者会这样说。
  • 不,没有打开任何连接,因为保持连接的对象位于程序的内存中。 在操作系统选择终止进程之后,不再有指向该连接对象的指针。 如果它仍在内存中,则无法访问,因此就好像它不存在。 我不知道Windows是否实现了一些奇怪的全局连接池,但如果是这样,它将是特定于操作系统的,我将永远不会依赖于此。
  • using语句定义一个范围,在该范围的末尾将放置一个对象。 因此,当到达using块的末尾时,它隐式调用了dispose方法。 它很漂亮,可以帮助您更好地在代码中定义范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM