Asp.net mvc 3 用EF构建ASP.netmvc3

Asp.net mvc 3 用EF构建ASP.netmvc3,asp.net-mvc-3,architecture,entity-framework-4.1,poco,Asp.net Mvc 3,Architecture,Entity Framework 4.1,Poco,我正试图构建我的MVC web项目,但我遇到了一点问题 我正在使用EF4.1。我已经用EDMX文件创建了一个DataAccess项目。然后,我使用dbContext生成器生成POCO.tt类 现在,我的业务逻辑层可以很好地访问POCO类,但表示层不能 我认为我应该创建另一个抽象级别,并将dbContext.tt文件放入它们自己的项目中,这样BusinessLogic层和表示层都可以访问POCO类,但只有BusinessLogic可以访问实体框架。表示层不需要了解任何有关EF的信息 像这样的 PO

我正试图构建我的MVC web项目,但我遇到了一点问题

我正在使用EF4.1。我已经用EDMX文件创建了一个DataAccess项目。然后,我使用dbContext生成器生成POCO.tt类

现在,我的业务逻辑层可以很好地访问POCO类,但表示层不能

我认为我应该创建另一个抽象级别,并将dbContext.tt文件放入它们自己的项目中,这样BusinessLogic层和表示层都可以访问POCO类,但只有BusinessLogic可以访问实体框架。表示层不需要了解任何有关EF的信息

像这样的

POCO Classes - DataAccess
    |             |
    |---------Business Logic
    |             |
    |_________Presentation
我在这方面做得对吗?如果是的话,我是简单地将.tt文件剪切/粘贴到新项目中,还是有办法强制dbContext插件在我的其他项目中创建这些文件?

考虑在业务逻辑层和表示层之间发送。这将允许您为视图塑造数据,并防止信息泄漏到表示层(例如,如果您的POCO中有业务逻辑所需但不需要在表示层中可用的字段)

问题是,您将如何将数据移动到 表示层?换句话说,表示层 是否保留对域模型程序集的引用?(在实体框架中) 在这种情况下,域模型程序集只是从 EDMX文件。)

从纯设计的角度来看,DTO是一个非常接近 完美DTO有助于进一步将演示文稿与 服务层和域模型。使用DTO时 表示层和服务层共享数据契约 而不是上课

DTO层将域模型与表示分离, 实现松耦合和优化的数据传输


如果您走这条路线,还可以查看帮助将DTO映射到POCO,反之亦然。

因此,有几种方法可以构建您的项目。您所指的是一种方式,即在所有层之间共享poco

另一种方法是让您的POCO位于数据和业务层,然后创建一个类似的对象模型,在UI和业务层之间共享。最后,您还可以仅为UI创建第三个模型,称为ViewModel


这完全取决于你的需要。如果对象模型非常复杂,则可能需要使用ViewModels对其进行简化

您的表示层不必知道任何有关EF的信息。只需从表示层引用该项目即可访问模型

然而,您的表示层在理想情况下不应该使用这些POCO模型中的任何一个。他们应该使用ViewModels。我不一定相信DTO,因为DTO有特定的用途。您的存储库/数据访问可以返回模型,但通常这些模型会返回到服务层。然后,服务层会将ViewModel表示返回给控制器

这也很好地为依赖项注入做好了准备,因为您只需将服务层注入控制器。然后,您可以将所需的任何存储库注入到您的服务中,等等


具有讽刺意味的是,我想我可能很快就会为这个主题写一本书:)

我想他的观点是,他想用POCO作为DTO。如果您不标记poco并对需求使用fluent映射,那么这是完全可能的。因此,我一直在研究ViewModels,我认为我理解这个概念。我的下一个问题:在创建ViewModel时,我是否引用模型中的POCO类?我看到的大多数示例似乎都访问某种类型的存储库,通常称为_accountRepository。但我不确定这些存储库存储在结构中的什么位置。我的存储库将保存在dataaccess项目中。存储库将返回您的EF poco对象(或任何poco对象)。在另一个项目中,我将使用我的逻辑ie服务。有些人选择在其模型类上使用扩展方法,这些扩展方法将转换为viewmodel。我在我的服务层中这样做,例如GetCustomerEditViewModel(int customerId),它获取我的实体,然后将其映射到poco。请参阅Jimmy Bogards的文章:我喜欢automap属性实现,以便将其转换为VM。