C# Dal(带有实体框架)和MVC中的模型层

C# Dal(带有实体框架)和MVC中的模型层,c#,asp.net-mvc,entity-framework,model-view-controller,data-access-layer,C#,Asp.net Mvc,Entity Framework,Model View Controller,Data Access Layer,首先,我将EF用于Dal层(与MVC分离的项目,相同的解决方案)。EF的EDMX文件中生成的模型是模型层中的实际模型??如果是这样,我如何访问这些模型以在MVC的视图中工作?我认为使用这些模型直接从视图访问数据层是错误的,如果我用“我的模型”创建一个模型层,并将Dal的模型转换为我的模型。。。这将是重复的代码 也许我有点不对劲,但大部分egs。我们使用代码优先的方法,我无法理解这一点。我在本地项目中使用视图模型,而在另一个项目中使用模型。然后在我的视图模型中的页面上放置我要使用的模型的引用。然后

首先,我将EF用于Dal层(与MVC分离的项目,相同的解决方案)。EF的EDMX文件中生成的模型是模型层中的实际模型??如果是这样,我如何访问这些模型以在MVC的视图中工作?我认为使用这些模型直接从视图访问数据层是错误的,如果我用“我的模型”创建一个模型层,并将Dal的模型转换为我的模型。。。这将是重复的代码


也许我有点不对劲,但大部分egs。我们使用代码优先的方法,我无法理解这一点。

我在本地项目中使用视图模型,而在另一个项目中使用模型。然后在我的视图模型中的页面上放置我要使用的模型的引用。然后在我的页面上引用视图模型。如果这听起来像是您想要做的事情,请告诉我,我可以在一些代码中进行编辑。

我可能弄错了,但对我来说,使用EDMX生成为您提供了DbContext,可以将其视为DAL和实体,可以将其视为模型

因此,您可以直接操作实体实例作为业务对象。通过DbContext对基础的操作应该出现在BLL层中。此外,您可以在需要的地方实现DTO


当然,这假设您希望使用实体框架代码生成。考虑到您的总体架构,使用POCO等其他选项可能更为相关。

您认为不直接从表示层访问DAL中的模型是正确的

为了避免在将DAL对象转换为视图所使用的模型时重复代码,您可以使用类似的方法,该方法应该在该场景中为您进行重磅提升

我认为使用这些模型直接从视图访问数据层是错误的

没错,适当的方法是使用
视图模型

当您有几十个不同的值要传递给一个视图时,同样的灵活性允许您 快速添加一个新条目,或者重命名一个现有条目,这将成为你最大的敌人 自己跟踪项目名称和值;您得不到Microsoft IntelliSense和编译器的帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义对象模型有助于跟踪该视图真正需要的内容。我建议你定义一个 添加到应用程序中的每个视图的视图模型类

--Dino Esposito的“编程Microsoft ASP.NET MVC”

ViewModel提供视图生成所需的所有信息。从ViewModel和您可以使用的业务实体传输数据


不要担心重复,这是两个不同的概念,应该相互分离;它使您的应用程序易于维护。

我也这么做,但交易是:如果我将实体框架(数据库优先)放在Dal层中,EF将在Dal中创建模型。如何在Dal中使用这些模型?我无法在视图模型中直接访问这些模型。如果我理解正确,我是否应该将EF用于混合层(即模型/Dal层)?如果是这样的话,我需要在MVC的层中使用这一层,但对我来说,拥有访问数据对象权限的控制器和视图听起来并不好。这样一来,EF确实是一个结合了DAL和模型的混合层。我对MVC了解不多,但据我所知,MVC的“模型”部分通常涵盖了系统的所有数据部分。它包括表示和操作(如检索或修改)。因此,我将其视为多层体系结构的模型和BLL层。这是真的,但在一个大项目中,将所有内容都放在模型“名称空间”中是疯狂的。即使在只使用控制器、模型和视图层的较小项目中,许多人也会将模型与视图/控制器放在不同的项目中。这是最佳解决方案吗?我认为EF会有一个更好的解决方案(比如我自己在一个单独的层中做POCO,然后通过EF跟踪它。实际上我看了一个视频,一个家伙“黑客”EF生成的文件,但这非常痛苦)。对于所有在同一个项目中的小型开发来说,EF是非常棒的,但是对于我来说,在一个大型开发中使用EF听起来并没有多大成效。。因为用automapper做这个“修复”听起来很痛苦。您是否同意我的观点,或者我使用EF是错误的?EF有您提到的解决方案,即使用代码优先的方法,即您创建POCO模型,并通过EF将它们透明地持久化到数据库中。因为您使用的是EDMX,所以我假设您正在基于现有数据库生成类。。。在这种情况下,您必须使用一些东西将这些类映射或转换为视图可用的模型(如果它们还不可用,或者您希望保持DAL分离的话)。实现这一点的方法是创建一个映射层,Automapper使其变得非常简单(您几乎没有代码要编写)。在我看来,在代码中处理DB(代码优先的方法)是不可接受的!这就是为什么我更喜欢数据库优先,但说真的,我会选择您的回复作为解决方案,因为您解释说“正确的解决方案”是自己为模型层创建模型,而不是愚蠢的重复代码。之后谢谢你们两位!好的,关于代码优先的方法有很多要说的,我发现它快速且更易于维护,并且通过迁移和版本控制使您的数据库更容易与代码保持同步。。。使用db-first方法可以做的所有事情当然,只是我发现它更容易,并且减轻了很多db维护和同步的负担。:)可能重复的