2

我知道标题看起来有点糟糕:) 但我不知道如何解释我的问题..

这对我来说通常是一个基本问题,但我不知道答案..

我正在编写一个服务器应用程序,它使用 eneter 库进行客户端-服务器通信,并且它还有一个 DAL 从数据库获取数据。作为一个服务器应用程序,它总是需要与数据库通信,所以我不知道哪种方式更有效。(大约,最多 50 个客户端将连接到服务器)

我正在使用实体框架并从我的 mysql 数据库中创建了一个模型。

第一个代码在这里

    private MyEntities ent;

    public DbHelper()
    {
     ent = new MyEntities();
    }

   void Foo()
  { 
       ent.Mytable.where......
       ....

  }

第二种类型代码是

    void Foo()
    {
        using (MyEntities ent = new MyEntities())
        {
            ent.Mytable.where...
        }

    }

我可以使用 using 语句或为 dal 类创建一个全局实例变量并将其用于每个函数.. 吗?

4

4 回答 4

2

更好的是,在您的 DAL 类上实现 IDisposable:

public sealed class MyDal implements IDisposable
{
    private MyEntities ent = new MyEntities();

    void Foo()
    { 
       ent.Mytable.where......
       ....

    }

    public void Dispose()
    {
        ent.Dispose();
    }
}

然后...

using(var dal = new MyDal())
{
    dal.Foo();
    //....
}

在这里阅读一下为什么我的 IDisposable 是密封的。

于 2013-06-02T12:42:22.057 回答
1

就变更跟踪的范围而言,这两种方法非常不同。如果两者都同样有效,那么请确保使用WithNoTracking.

您可以像在第一个代码中一样为您的实体创建一个成员变量。但是因为你不能using(){}围绕它写一个语句,所以包含的类应该是IDisposable. 然后消费类应该在 using(){}.

于 2013-06-02T12:41:05.947 回答
1

从性能的角度来看,这并不重要。与实际的数据库交互相比,创建上下文实例是一个非常快速的操作。

但是,您应该在任何情况下处理创建的上下文,因为它将数据库连接作为本机资源。

如果你想在你的DbHelper类中使用上下文成员,这个类应该实现IDisposable,以便你可以在DbHelper实例本身被释放时释放上下文:

public class DbHelper : IDisposable
{
    private MyEntities ent;

    public DbHelper()
    {
        ent = new MyEntities();
    }

    public void Foo()
    {
        //...
    }

    public void Bar()
    {
        //...
    }

    public void Dispose() // implementation of IDisposable
    {
        ent.Dispose();
    }
}

using您可以在一个块中使用此类:

using (var helper = new DbHelper())
{
     helper.Foo();
     helper.Bar();
} // helper and helper.ent gets disposed now
于 2013-06-02T12:44:06.347 回答
1

这取决于存在哪些其他方法以及它们的作用。如果您想使用 ORM 进行更改并保留这些更改,您将需要创建对象的数据上下文。此外,如果您希望身份管理器在您两次查询同一事物时为您提供相同的对象实例,您将需要使用相同的数据上下文 - 所以您需要将其放在手边。最后,如果该类型使用延迟加载并且您希望它能够工作 - 如果您已经处理了数据上下文,那将无法正常工作。

但是,如果您只想对数据进行只读访问,而无需更改跟踪、延迟加载或身份管理:立即处理。并且也许考虑诸如根本不具有这些功能的微 ORM 之类的东西(故意地,最小化和快速)。

于 2013-06-02T12:45:15.647 回答