1

我是一名新的 .NET 开发人员,我第一次使用 LINQ-to-Entities。由于我在这方面进行了很多练习,所以我想向您询问有关实体框架的问题,我在 Google 上找不到它的解决方案。因为我连接到我的代码中的实体如下:

using(MyEntities context = new MyEntities())

为什么要使用 Using 块连接到实体?有没有办法像定义一个 Helper 类来处理这个问题?

4

2 回答 2

2

您使用using语句来确保您使用完的任何资源都得到处置,因此它们在不需要时不会使用任何内存。例如,如果您要打开许多与实体框架 (EF) 的连接,您的应用程序可能会消耗大量内存并在运行它的机器上造成一些问题。

using语句调用Dispose()实现IDisposable(接口)的对象。using您可以通过显式调用来避免使用该语句Dispose()。(但您可能会忘记,因此很容易将using用于您想要在完成后处理的对象。)

您可以在帮助程序类中设置连接,例如,通过使用单例模式来确保您最多只有一个具有实体连接的对象。但在 EF 的情况下,这可能会导致 EF 跟踪出现其他问题。您还可以设置一个存储库(C# EF 存储库模式),它是打开和关闭这些与 EF 的连接并将其整齐地保存在一个地方的唯一类。

于 2013-11-09T15:56:59.327 回答
2

using是在对象使用结束时说 .Dispose() 的便捷快捷方式。它将您的代码包装在 try-finally 块中,因此,即使发生异常,所有对象资源(如打开的连接等)都将被释放。这是必要的,因为例如连接实际上是有限的资源,应该小心对待。

所以不是手动编码

//Define context object here
try
{
    //Do some job, which might lead to exception
}
finally
{
    context.Dispose();
}

你做的很简单

using(var context = new MyEntities())
{
    //Do some job, which might lead to exception
}   //Resources will be disposed here

有效地它是相同的。但更容易写。此外,您可以(并且大多数情况下应该,这是一种很好的做法)将 using 应用于任何实现IDisposable接口的类的对象。

一些读物: 实体框架和上下文处置

实体框架 4 - winform 应用程序中的生命周期/上下文范围 //尽管关于 winforms,仍然很有趣的讨论

http://msdn.microsoft.com/en-us/library/system.idisposable%28v=vs.110%29.aspx

using only 确保您的非托管资源将在 using 块结束时被安全处置。您不需要在 finally 块中进行手动处理。正常的异常处理还是需要组织的。由你决定,怎么做。

 try
 {
    using(var context = new MyEntities()) //Connection is not opened yet...
    {
        var data = context.Collection.ToList(); //Here Entity will try to open connection.
        //If it's impossible, you will have EntityException. 
    }   //Resources will be disposed here
 }
 //Something about entity
 catch(EntityException ex)
 {
     //Let's log it...
     Logger.Log.Error("Some problem with entity...", ex);
     //Show message, or notify user in other way
     MessageBox.Show("Problem with database.");
 }
 //You don't know, what happened, but will check log
 catch(Exception ex)
 {
     Logger.Log.Error("Unknown problem...", ex);
     //Show message, or notify user in other way
     MessageBox.Show("Problem. If it will persist, contact your admins");
 }

但这只是存根。真正应该做什么,很大程度上取决于您的应用程序和数据库访问架构......

于 2013-11-09T15:57:17.987 回答