MVC EF上下文实例



我很抱歉,如果我的问题看起来很愚蠢,我尝试了谷歌搜索,但找不到我想要的东西,所以任何建议都将不胜感激。

我对MVC的想法很陌生,我从事Web表单开发已有多年了,但是我想尝试一下其他东西。

我正在使用实体框架(6)进行数据库连接,而MVC4用于Web前端。

我的问题是,DB上下文实例应该如何处理。

我正在工作的控制器动作代码是此

public ViewResult List(int buildingId)
{
    var model = new Data.Model();
    var query = from r in model.Rooms
                where r.Building.Id == buildingId
                select r;
    /*
    var q2 = model.Buildings.Where(b => b.Id == buildingId).SelectMany(b => b.Rooms);
    var q3 = model.Buildings.Where(b => b.Id == buildingId).First().Rooms;
    */
    return View(query);
}

评论的线只是我可以获得寻找的查询结果的其他方法。 Data.Model是EF DB上下文。

我不喜欢的是上下文是可置的,我没有处置它。在我看来,这是懒惰和糟糕的做法。

我已经用model开始处理测试,我需要的第一个更改是返回查询列表,我不介意,但是由于上下文被处置,在视图上,我无法访问诸如@item.Building.Description之类的属性。因此,如果处置我需要返回我在视图上显示的内容(有多种方法可以做到这一点,所以我不是很担心如何)。

另一个选项是在项目中的某个地方设有静态/共享上下文,因此所有数据库请求都使用相同的上下文实例。从侧面来说,这是很好的,然后只会使用一个DB连接,但是EF可能已经对我进行处理,所以我不想使用EF设计的方式,如果这是应该的话。

所以,我的问题是,什么将被视为最佳实践?

  • 继续像我一样工作,实例化新环境,而不处理。
  • 每次处置上下文,并确保我在视图上返回我需要的任何东西。
  • 如果已经实例化,请使用将返回静态上下文实例的类。

谢谢

通常,我建议使用更构建的方法,并使用单独的(数据提供)层从数据库中获取数据。在这种情况下,IOC(控制控制)容器(例如Ninject,Unity等)可以为您处理对象寿命,但是如果您之前没有使用过依赖性注入模式,那么您有很多要首先调查的。p>话虽如此,简单的答案是,您绝对应该尽快处置context对象(总的来说,它们应该尽可能差)。常见模式是

using (var model = new Data.Model())
{
    var buildings = model.Rooms.Where(r => r.Building.Id == buildingId).ToList();
}

您通过调用ToList()并处理上下文来立即获取数据。这避免了您在返回查询并将其传递给视图时遇到的问题。正如您注意到的那样,控制何时确切执行DB Query以及何时处置上下文非常棘手。

Another option would be to have a static/shared context somewhere in the project, so all database requests use the same context instance-这是可怕的想法和众所周知的不良练习/对抗。

总而言之,最佳做法是您在列表中的选项2中所描述的正常工作:Dispose the context each time, and make sure I return anything I need visible on the view.

作为旁注,最好使用ViewModel每个视图(请参阅ASP.NET MVC-如何确切使用视图模型)

最新更新