3

有很多这样的代码块:

public class SomeController : Controller
{
    DbEntities entity = new DbEntities();

    public ActionResult Add()
    {
        entity.someOperations...
        return View();
    }

    public ActionResult Edit()
    {
        entity.someOperations...
        return View();
    }

    public ActionResult Detail()
    {
        entity.someOperations...
        return View();
    }

    public ActionResult Detail()
    {
        entity.someOperations...
        return View();
    }

    .....

我应该改变这样的方法吗?:

public class SomeController : Controller
{
    public ActionResult Add()
    {
        using(DbEntities entity = new DbEntities())
        {
            entity.someOperations...
        }

        return View();
    }
    .....

using-statement在 EF中不使用有什么问题?或者最好的方法是什么?此外,如果我们使用using-statement代码块会增长。

谢谢...

4

2 回答 2

5

如果使用using 语句,在上面的示例中没有大问题,但是当 dbContext 是局部变量时,很难为这样的代码编写单元测试。

如果您不遵循 Repository、Unit of Work 等任何设计模式,不想编写单元测试,那么在这种情况下将所有逻辑包装在using 语句中是最佳选择。

于 2013-02-01T10:10:37.040 回答
2

using声明方法是您上面提出的两种方法中最好的。使用这种方法,您可以确保在ObjectContext使用后将其关闭并丢弃。

使用您的另一种方法,人们会假设ObjectContext可以保持未关闭状态,因此会占用与数据库的连接。要查看实际情况,请尝试使用其他方法创建示例应用程序,然后使用EFProfiler对其进行分析并观察ObjectContext打开的数量增加,而关闭的数量会明显减少。

我最近参与了一个项目,该项目在采用您的第二种模式的高使用率下存在数据库问题(您可以在此处查看我的问题)。由于我没有足够的时间处理项目/代码库太大,因此我没有选择切换到using语句方法的选项。相反,我实现了以下手动强制处置in Global.asax (我在我的静态实例上有ObjectContext一个实例:End_RequestDbContextBusinessLayerService

protected void Application_EndRequest(object sender, EventArgs e)
    {
        BusinessLayerService.Instance.Dispose();
        BusinessLayerService.Instance = null;
    }

但是,如果您从项目开始就可以选择:我强烈建议您使用该using模式

于 2013-02-01T10:06:01.947 回答