我何时将我的特定数据访问逻辑放在我的模型中的MVC中?

时间:2013-02-03 21:07:06

标签: asp.net-mvc entity-framework model-view-controller separation-of-concerns

开箱即用,当您使用Entity Framework在MVC中创建控制器时,您将获得将数据拉入控制器以显示在视图中的基本Get语句。例如:

    public ActionResult Index()
    {
        var capsules = db.capsules.ToList();
        return View(capsules);
    }

我理解它的方式,编写MVC代码的最佳方法是将您的数据特定逻辑放在Models项目中。然后,控制器在您拥有逻辑的任何模型类中调用该方法,检索数据,然后将其发送到视图。上面的例子只是简单地检索一个非常基本的胶囊列表。我没有创建一个特殊的“CapsuleModelContext”类来处理胶囊检索操作,因为它是在我的edmx文件中处理的。

我想这一切都归结为我是否应该在Controller或Model的上下文类中实例化dbContext的问题。开箱即用,dbContext在Controller中实例化。这里有关于最佳实践的建议吗?

1 个答案:

答案 0 :(得分:5)

请区分域模型视图模型。您的视图模型不负责持久化数据。您的视图模型仅作为传递到视图和从视图传递的实体的容器存在。很简单,它们是视图的模型 - 而不是视图旨在操纵的持久数据。

考虑到这一点,您应该使用控制器与您用来操纵持久数据的任何实体进行交互(无论是存储库还是 - 更直接地 - 数据库上下文)。视图模型用作将视图中的数据传递到控制器的媒介,然后将您的字段映射到其所属的任何业务实体并进行交互用你选择的持久性方法。视图模型和您的业务实体模型应该彼此无知。

您的视图模型应该包含的唯一逻辑(理想情况下,这应该保持在最小值)是明确仅针对该视图模型本身的逻辑。

我在一个类似的问题上发布了另一个答案,这个问题展示了这在实践中如何运作的骨架:

TextBoxFor() not generating validation markup