我是个新手在实体的框架,和ASP.Net 视,具有了解到大部分来自教程,而不具有深刻的理解。(我有经验。网2.0的ADO.Net 和web表单)

我现在怀疑来自我实例我实体的对象。

基本上我这样做在我的控制器:

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作为一个参数。这是我所做的一切都与我连接目前皇宫-对-SQL存在。

其他的事情这让我感到不安的是,"NorthWindEntities"实现IDisposable,其中通过《公约》意味着我应该叫它Dispose()方法,我没有。

你怎么想这个的?
这是正确的实例的实体对象为我在做什么?它应该照顾其连接通过打开和关闭他们的每个查询?
或者我应该处理它明确地与一个使用()条款?

谢谢!

有帮助吗?

解决方案

控制器本身实现IDisposable.所以你可以复盖处置和处置的任何事情(如象上下文),初始化时控制器是实例化。

控制器,只生活,因为只要作为一个单一的请求。因此,有一个利用内部的一个行动,并具有一个目的方面的整个控制器是完全相同数量的上下文:1.

最大的差别之间这两种方法是,这一行动将完成前景已经呈现。所以如果你创造你的体在使用的声明内的行动,体将已安置的前景已经呈现。所以你最好已经读任何东西从上下文,你需要的行动前完成。如果你通过的观点是一些懒惰的列表状IQueryable,你将有设置的上下文中的前景是呈现,造成一个异常的时候看试图列举的IQueryable.

相比之下,如果初始化体当控制器被初始化(或写懒惰的初始化时代码,导致它被初始化时运行操作)和处置体在控制器。处理,然后背景下仍然会被周围的当视是呈现。在这种情况下,它是安全的通IQueryable到图。控制器将被安置之后不久,图的呈现方式。

最后,我必须如果我没有点出,它可能是一个坏主意你的控制器可以知道实体框架。看到使用一个单独的组件,用于模型和储存库的模式到具有控制器交谈的模式。谷歌搜索将会把相当多这一点。

其他提示

你是做一个好点在这里。 应该多长时间体的生活吗? 所有模式和做法的书籍(喜欢恐龙的埃斯波西托 Microsoft-NET-设计应用程序)告诉你,一个属性,必须活不长,也不应该被缓存。

我只是想知道为什么没有,你的情况,ControllerBase类(我不知道该视实现,因此承担与我)在体被发起的一次对所有控制器。特别是想想 身份地图图案, 那是已经实现的实体的框架。即使你需要打电话给另一个控制器作为你的PostsController,它仍然使用相同的上下文并提高性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top