Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/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
Asp.net mvc 在MVC中,我什么时候将特定的数据访问逻辑放入模型中?_Asp.net Mvc_Entity Framework_Model View Controller_Separation Of Concerns - Fatal编程技术网

Asp.net mvc 在MVC中,我什么时候将特定的数据访问逻辑放入模型中?

Asp.net mvc 在MVC中,我什么时候将特定的数据访问逻辑放入模型中?,asp.net-mvc,entity-framework,model-view-controller,separation-of-concerns,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代码的最佳方法是将特定于数据的逻辑放在模型项目中。然后,控制器在逻辑所在的任何模型类中

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

    public ActionResult Index()
    {
        var capsules = db.capsules.ToList();
        return View(capsules);
    }
按照我的理解,编写MVC代码的最佳方法是将特定于数据的逻辑放在模型项目中。然后,控制器在逻辑所在的任何模型类中调用该方法,检索数据,然后将其发送到视图。上面的示例只是检索一个胶囊列表——非常基本。我没有创建一个特殊的“CapsuleModelContext”类来处理胶囊检索操作,因为它是在我的edmx文件中处理的


我想这一切都归结为这样一个问题:我是否应该在控制器中实例化dbContext,或者在模型的context类中实例化dbContext。开箱即用,dbContext在控制器内实例化。这里有关于最佳实践的建议吗?

请区分您的域模型和视图模型。视图模型不负责持久化数据。视图模型只是作为实体的容器存在,这些实体在视图之间传递。很简单,它们是视图的模型,而不是视图设计用来操作的持久化数据

考虑到这一点,您应该使用控制器与用于操作持久化数据的任何实体(无论是存储库还是更直接的数据库上下文)进行交互。视图模型用作一种媒介,通过它将数据从您的视图传送到您的控制器,控制器反过来将您的字段映射到它所属的任何业务实体,并与您选择的持久化方法交互。视图模型和业务实体模型应该互不了解

您的视图模型应该包含的唯一逻辑(理想情况下,应该将其保持在最低限度)是仅特定于该视图模型本身的逻辑

我发布了一个类似问题的另一个答案,它展示了这在实践中是如何工作的:


请区分您的域模型和视图模型。视图模型不负责持久化数据。视图模型只是作为实体的容器存在,这些实体在视图之间传递。很简单,它们是视图的模型,而不是视图设计用来操作的持久化数据

考虑到这一点,您应该使用控制器与用于操作持久化数据的任何实体(无论是存储库还是更直接的数据库上下文)进行交互。视图模型用作一种媒介,通过它将数据从您的视图传送到您的控制器,控制器反过来将您的字段映射到它所属的任何业务实体,并与您选择的持久化方法交互。视图模型和业务实体模型应该互不了解

您的视图模型应该包含的唯一逻辑(理想情况下,应该将其保持在最低限度)是仅特定于该视图模型本身的逻辑

我发布了一个类似问题的另一个答案,它展示了这在实践中是如何工作的:


谢谢您提供的信息,但我不是在问域模型和视图模型之间的区别。我理解视图模型背后的原因。我问的是DbContext是否应该在控制器(开箱即用)或模型的上下文中实例化。就MVC模式而言——这似乎是您要问的——您的DbContext应该在控制器中实例化,而不是在模型中实例化。是否从控制器中直接实例化DbContext(通过使用服务层或存储库)中抽象出来是另一回事。无论如何,我看不出在域模型或视图模型中实例化DbContext会有什么好处!感谢您提供的信息,但我并不是在问域模型和视图模型之间的区别。我理解视图模型背后的原因。我问的是DbContext是否应该在控制器(开箱即用)或模型的上下文中实例化。就MVC模式而言——这似乎是您要问的——您的DbContext应该在控制器中实例化,而不是在模型中实例化。是否从控制器中直接实例化DbContext(通过使用服务层或存储库)中抽象出来是另一回事。无论如何,我看不出在域模型或视图模型中实例化DbContext会有什么好处!