gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:01:12 25 4
gpt4 key购买 nike

我正在编写一个简单的控制台应用程序,它只执行以下操作:
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
}
}
}

我的一位同事告诉我,我必须将代码包含在“using”语句中以关闭应用程序和数据库服务器之间的连接,如下所示:

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 block 的末尾时隐式调用 dispose 方法。它具有装饰性,可帮助您更好地定义代码中的范围。

关于c# - 在 C# 中退出控制台应用程序之前处理 EF DbContext 的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56879137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com