Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控制台应用程序退出C之前处理EF DbContext的重要性#_C#_.net_Sql Server_Entity Framework - Fatal编程技术网

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

C# 在控制台应用程序退出C之前处理EF DbContext的重要性#,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我正在编写一个简单的控制台应用程序,它只执行以下操作: 1.查询数据库中的某些数据。 2.处理此数据。 3.更新数据库。 我编写了代码,它只包含Main方法,如下所示: class Program { static void Main(string[] args) { try { var dbContext = new MyDatabaseContext(); var dbRecord = dbContext.M

我正在编写一个简单的控制台应用程序,它只执行以下操作:
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
       }  
    }
}
我的一位同事告诉我,我必须将代码包含在“using”语句中,以关闭应用程序和数据库服务器之间的连接,如下所示:

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方法。它是装饰性的,可以帮助您更好地定义代码中的作用域

在您的特定情况下,使用的
将不会产生可测量的效果。当应用程序退出时,连接将关闭。不过,让使用
语句成为一种习惯是个好主意;即使在这样的情况下,请不要接受这样的例外情况。它最终会咬你。至少记录或打印它们,或返回非零。是的,在一次性对象上使用
是一个好主意,即使您“肯定”知道对象的生命周期将与您的应用程序一致。例如,在退出前未能处理
,意味着您可能会丢失从未写入的缓冲数据。无论发生什么情况,非托管资源(套接字、文件)都将由操作系统释放,因此您无需担心进程之外的任何泄漏,但“干净处理”可避免数据丢失、由“粗暴中止”引发的错误/警告换句话说:不值得记住,在使用
DbContext
的特殊情况下,不处理它不会产生负面影响,因为不值得“优化”清理,也不值得在没有冗余的情况下出错一次。布雷德利,戴夫和杰伦·莫斯特。将代码从第一个状态更改为第二个状态是否如此重要,以至于您可能会推迟更改代码的重要时间和截止日期?