【问题标题】:Entity Framework context实体框架上下文
【发布时间】:2011-11-25 14:06:45
【问题描述】:

我有一个应用程序首先使用实体​​框架代码。我的设置是我有一个所有其他服务都继承自的核心服务。核心服务包含以下代码:

public static DatabaseContext db = new DatabaseContext();

    public CoreService()
    {
        db.Database.Initialize(force: false);
    }

然后,另一个类将从 CoreService 继承,当它需要查询数据库时,将运行一些代码,例如:

db.Products.Where(blah => blah.IsEnabled);

但是,关于哪个最好,我似乎得到了相互矛盾的故事。

有些人建议不要做我正在做的事情。

其他人说你应该为每个类定义上下文(而不是使用基类来实例化它)

其他人说,对于每个数据库调用,我都应该将它包装在 using 块中。我从未在 Microsoft 的任何示例中看到过这一点。

谁能澄清一下?

我目前正处于可以重构并且速度非常快的地步,所以如果可能的话,我想要一些一般性的建议。

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    您应该为每个 Web 请求包装一个上下文。只要你需要它就一直打开它,然后在你完成后把它扔掉。这就是使用的目的。

    不要将你的上下文包裹在单例中。这不是一个好主意。

    如果您正在与 WinForms 之类的客户端合作,那么我认为您会在每个表单周围包含上下文,但这不是我的领域。

    此外,请确保您知道何时对数据源实际执行,这样您就不会在可能只需要执行一次即可处理结果的情况下进行多次枚举。

    最后,您从 MS 看到了这种做法,因为很多 ADO 的东西都支持包装在 using 中,但几乎没有人意识到这一点。

    【讨论】:

      【解决方案2】:

      我建议使用“优先组合胜过继承”的设计原则。 您可以在基类中引用数据库上下文。 实现一个单例来获取 DataContext 并将 datacontext 分配给这个引用。

      【讨论】:

        【解决方案3】:

        您得到的冲突与类之间共享上下文无关,而是由您的上下文的static 声明引起的。如果您将上下文设置为服务类的 instance 字段,以便每个服务实例都有自己的上下文,那么应该没有问题。

        您提到的using 模式不是必需的,但您应该确保在服务处置时调用context.Dispose()

        【讨论】:

        • 谢谢,我应该在类的析构函数中调用 context.dispose() 吗?
        • 不幸的是,析构函数不是确定性的,因此无法控制何时调用它们。相反,您应该在处理管道中找到一个迟到的事件并将Dispose 放在那里。例如,在 ASP.NET 中,这可能是 Application_EndRequest(如果数据上下文对 HttpContext 是唯一的),但当然这取决于您用于构建服务的技术。
        猜你喜欢
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多