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
的特殊情况下,不处理它不会产生负面影响,因为不值得“优化”清理,也不值得在没有冗余的情况下出错一次。布雷德利,戴夫和杰伦·莫斯特。将代码从第一个状态更改为第二个状态是否如此重要,以至于您可能会推迟更改代码的重要时间和截止日期?