我是实体框架和 ASP.Net MVC 的新手,主要从教程中学习,但对两者都没有深入的了解。 (我确实有 .Net 2.0、ADO.Net 和 WebForms 的经验)
我当前的怀疑来自于我实例化实体对象的方式。
基本上我在我的控制器中这样做:
public class PostsController : Controller {
private NorthWindEntities db = new NorthWindEntities();
public ActionResult Index() {
// Use the db object here, never explicitly Close/Dispose it
}
}
我这样做是因为我在一些 MSDN 博客中发现了它,该博客对我来说似乎足够权威,因此我认为这是正确的方法。
不过,我对此感到非常不安。虽然它节省了我很多代码,但我习惯这样做:
using (NorthWindEntities db = new NorthWindEntities() {
}
在每个需要连接的方法中,如果该方法调用需要连接的其他方法,它会将 db 作为参数传递给它们。这就是在 Linq-to-SQL 存在之前我对连接对象执行所有操作的方式。
另一件让我不安的事情是 NorthWindEntities 实现了 IDisposable,按照惯例这意味着我应该调用它的 Dispose() 方法,但我没有。
你怎么看待这件事?
像我一样实例化实体对象是否正确?它是否应该通过为每个查询打开和关闭连接来处理连接?
或者我应该使用 using() 子句显式处理它?
Thanks!
控制器本身实现了IDisposable。因此,您可以覆盖 Dispose 并处置在实例化控制器时初始化的任何内容(例如对象上下文)。
控制器的生命周期只有一个请求。因此,在动作内部使用 using 和整个控制器拥有一个对象上下文的上下文数量完全相同:1。
这两种方法之间的最大区别在于,操作将在视图渲染之前完成。因此,如果您在操作内的 using 语句中创建 ObjectContext,则 ObjectContext 将在视图呈现之前被释放。因此,您最好在操作完成之前阅读上下文中所需的任何内容。如果传递给视图的模型是一些惰性列表(例如 IQueryable),则您将在呈现视图之前释放上下文,从而在视图尝试枚举 IQueryable 时导致异常。
相比之下,如果您在初始化 Controller 时初始化 ObjectContext(或编写延迟初始化代码,使其在操作运行时初始化)并在 Controller.Dispose 中处置 ObjectContext,则当控制器初始化时,上下文仍然存在。视图已渲染。在这种情况下,将 IQueryable 传递给视图是安全的。视图渲染后不久控制器就会被释放。
最后,如果我没有指出让控制器了解实体框架可能是一个坏主意,那就是我的失职。考虑为您的模型和存储库模式使用单独的程序集,以使控制器与模型对话。谷歌搜索会出现很多关于此的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)