使用类似这两种方法的上下文的区别是什么
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));
}
}
// ...
}
答案 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将不允许这样做(第二个示例)。在第二个示例中,对延迟操作的任何引用都会给您一个例外。