Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 3 困惑:为什么我必须将实体对象映射到viewmodel对象_Asp.net Mvc 3_Viewmodel_Automapper - Fatal编程技术网

Asp.net mvc 3 困惑:为什么我必须将实体对象映射到viewmodel对象

Asp.net mvc 3 困惑:为什么我必须将实体对象映射到viewmodel对象,asp.net-mvc-3,viewmodel,automapper,Asp.net Mvc 3,Viewmodel,Automapper,我是实体框架的新手,mvc三周前才开始使用它。 从那时起,我一直在寻找正确的方法。我挖得越多,我就越迷路……我担心我无法在mvc中进一步使用实体框架 我感到失落和沮丧:( 我一直在尝试为MVC应用程序使用实体框架。为此,我从创建School.edmx文件开始(该文件已自动创建School.Designer.cs。我没有任何POCO或任何其他文件,只是使用Designer类创建了普通的edmx).然后通过一些搜索,我发现使用实体对象作为视图的模型是不好的做法 现在真正的事情开始了,我为一个实体对象

我是实体框架的新手,mvc三周前才开始使用它。 从那时起,我一直在寻找正确的方法。我挖得越多,我就越迷路……我担心我无法在mvc中进一步使用实体框架

我感到失落和沮丧:(

我一直在尝试为MVC应用程序使用实体框架。为此,我从创建School.edmx文件开始(该文件已自动创建School.Designer.cs。我没有任何POCO或任何其他文件,只是使用Designer类创建了普通的edmx).然后通过一些搜索,我发现使用实体对象作为视图的模型是不好的做法

现在真正的事情开始了,我为一个实体对象创建了一个viewmodel。问题是我真的不明白为什么我必须使用存储库,为什么我必须映射我的实体对象和viewmodel对象。每次我搜索为什么我必须映射,我都会得到一些链接,说明如何使用automapper,我搜索存储库越多,我就越迷路。我知道我甚至都不明白。为什么我必须映射…??为什么我必须使用存储库

现在我反复问自己的另一件事是,为什么我必须在Viewmodel类中再次编写数据注释,而我已经在designer.cs文件中对其进行了数据注释(如[Required]、[Email]和其他注释)…为什么还要再次编写它们!!(如果我在Viewmodel中没有提到它们,我就看不到注释起作用了).注释的重复

我迷路了,我甚至不知道我现在在哪里 有人给我一条正确的道路
您诚挚的,
迷失和困惑的新手

问题是我真的不明白为什么我必须使用存储库

MVC可帮助您编写清晰分离关注点的代码。在这种情况下,存储库旨在说明应用程序如何与特定实体的数据存储交互。如果您需要
Student
实体,请调用
StudentRepository.GetEntity()
。如果要保存,请调用
StudentRepository.SaveEntity(学生)

为什么我必须映射我的实体对象和viewmodel对象。每次搜索为什么我必须映射时,我都会得到一些链接,说明如何使用automapper,我搜索的关于存储库的内容越多,我就越迷路

虽然您可以在视图中直接使用这些实体来处理简单的情况,但当您有更复杂的视图时,就会出现问题—可能需要多个实体的组合视图,只需要显示实体的子集甚至多个实体的子集的视图。因此,是的,您可以直接显示实体,但我发现这更容易o创建单独的视图模型

Automapper用于帮助从视图模型映射到实体

entity.Name = viewModel.Name;
entity.Age = viewModel.Age;
...
自动映射用于自动映射这些属性

现在我反复问自己的另一件事是,为什么我必须在Viewmodel类中再次编写数据注释,而我已经在designer.cs文件中对其进行了数据注释(如[Required]、[Email]和其他注释)

您应该为视图模型中的每个视图指定特定的验证逻辑,以便如果控制器上的验证失败,它可以停止处理而不是继续。尽管实体数据注释会阻止将视图模型映射到实体并尝试保存,但我发现查看视图及其视图模型更清楚了解发生了什么,而不是从一个视图到另一个视图模型再到实体

更新:


看看和。我发现它们在试图理解视图模型时都很有用。

别担心!

实体框架是一个基于另一个框架野兽ADO.NET的框架野兽。除了理解ADO.NET,真正理解实体框架是非常困难的

尽管如此,实体框架在某些场景中是完美的工具。但是,您(和我们中的许多人一样)似乎对EF、ASP.NET MVC和存储库的角色存在脱节

问题是,你不需要存储库。你甚至不需要视图模型。你不需要EF。你甚至不需要ASP.NET MVC。所有这些工具都用于简化特定的作业。它们之间没有直接的联系,任何一个都可以独立使用

存储库:用于将某些对象放在某个持久化的位置,以便以后可以获取它们。这就是它的全部功能

ASP.NET MVC:是一个HTTP处理程序,它接受请求的URL并实例化一个控制器类,该类反过来提供视图。视图显示一些模型,并且由于视图是交互式的,因此允许用户发送另一个请求,重新开始整个过程。因为此过程是(有意但不一定)无状态,需要某种持久性。这种持久性可以是服务器上的文件、文件数据库,或者在大多数情况下是关系数据库

实体框架:位于ADO.NET(Microsoft的关系数据库抽象框架)之上,允许您将对象从图形(内存中)表单映射到关系(数据库中)表单,然后再返回。的想法是允许开发人员轻松地将对象映射到数据库和从数据库映射对象。但是,这不是一个简单的过程,因为您没有直接与数据库交互(无论是否通过ADO.NET),有一些内在的复杂性。其中一个复杂性是信息的显示

查看模型(asp.net mvc查看模型):允许以各种形式显示模型。例如,我们可能有一个“学术记录”表和一个“个人”表,