什么是使用这两种方法的上下文的区别

时间:2013-06-21 17:57:40

标签: asp.net-mvc

使用类似这两种方法的上下文的区别是什么

public class MyController : Controller
{
    MyContext db = new MyContext();

    public ActionResult Index()
    {
        return View(db.Users.First(m => m.Id == 1));
    }
    // ...
}

public class MyController : Controller
{
    public ActionResult Index()
    {
        using (MyContext db = new MyContext())
        {
            return View(db.Users.First(m => m.Id == 1));
        }
    }
    // ...
}

2 个答案:

答案 0 :(得分:3)

首先,上下文可在全班范围内使用。它在初次使用后也从未被妥善处理(至少不是在你给我们的代码的上下文中)。

在第二个中,上下文在using块内实例化。在块之后,上下文被妥善处理。

答案 1 :(得分:1)

仅供参考,这是在控制器级别创建时如何处理db上下文:

public class MyController : Controller
{
    MyContext db = new MyContext();

    public ActionResult Index()
    {
        return View(db.Users.First(m => m.Id == 1));
    }
    // ...

    // This is automatically called by the framework, after
    // the ActionResult.ExecuteResult() is called.
    protected override void Dispose(bool disposing)
    {
        if (disposing && db != null)
        {
            db.Dispose();
        }

        base.Dispose(disposing);
    }
}

执行视图后调用控制器的Dispose方法。这将允许您在视图中调用任何延迟属性(IQueryables,延迟加载属性)。在操作中处理dbcontext将不允许这样做(第二个示例)。在第二个示例中,对延迟操作的任何引用都会给您一个例外。