Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架-我应该如何引用我的;“实体”;对象_Entity Framework_Dispose_Connection - Fatal编程技术网

Entity framework 实体框架-我应该如何引用我的;“实体”;对象

Entity framework 实体框架-我应该如何引用我的;“实体”;对象,entity-framework,dispose,connection,Entity Framework,Dispose,Connection,我是EntityFramework和ASP.NETMVC的新手,主要从教程中学习,对两者都没有深入的了解。(我确实有.NET2.0、ADO.Net和WebForms方面的经验) 我目前的怀疑来自我实例化实体对象的方式 基本上,我是在我的控制器中这样做的: public class PostsController : Controller { private NorthWindEntities db = new NorthWindEntities(); public Actio

我是EntityFramework和ASP.NETMVC的新手,主要从教程中学习,对两者都没有深入的了解。(我确实有.NET2.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()方法,而不是

您对此有何看法?
像我这样实例化Entities对象是否正确?它是否应该通过为每个查询打开和关闭连接来维护其连接?
还是应该使用using()子句显式地处理它


谢谢

控制器本身实现IDisposable。因此,您可以覆盖Dispose并在实例化控制器时处理您初始化的任何内容(如对象上下文)

控制器的寿命仅与单个请求的寿命相同。因此,在一个动作中使用一个对象上下文和在整个控制器中使用一个对象上下文的数量是完全相同的:1

这两种方法之间的最大区别在于,动作将在视图渲染之前完成。因此,如果在操作内的using语句中创建ObjectContext,则在呈现视图之前,ObjectContext将被释放。因此,您最好在操作完成之前阅读上下文中需要的任何内容。如果传递给视图的模型是某个惰性列表(如IQueryable),则在呈现视图之前,您将已释放上下文,从而在视图尝试枚举IQueryable时导致异常

相反,如果在初始化控制器时初始化ObjectContext(或编写惰性初始化代码,使其在操作运行时初始化),并在Controller.dispose中处置ObjectContext,则在呈现视图时,上下文仍然存在。在这种情况下,将IQueryable传递给视图是安全的。渲染视图后不久,将释放控制器


最后,如果我没有指出让您的控制器知道实体框架可能是个坏主意,那我就是失职了。研究为您的模型和存储库模式使用单独的程序集,让控制器与模型对话。谷歌搜索会在这个问题上出现很多问题。

你在这里提出了一个很好的观点ObjectContext应该存在多长时间?所有模式和实践书籍(如Dino Esposito)都告诉您,DataContext不能存在很长时间,也不应该缓存


我只是想知道,在您的例子中,为什么没有一个ControllerBase类(我不知道MVC实现,所以请耐心等待),在这个类中,ObjectContext可以一次性启动所有控制器。特别是考虑实体框架已经实现的。即使您需要调用另一个控制器作为PostsController,它仍然可以在相同的上下文中工作,并提高性能。

好的,这是有意义的。现在,问题是。。。我做错事情了吗?我真的需要处理实体对象吗?如果我不这样做会怎么样?我是否会“泄漏”到SQL Server的连接?ObjectContext.Dispose没有多少作用(请参阅Reflector)。但我们有理由认为这种情况可能会改变,你应该处理掉它。