实体框架和DTO

时间:2011-05-06 11:04:53

标签: c# dto

我计划使用EF(POCO)生成的实体向客户端发送数据而不是创建DTO?这是一个好习惯吗?基本上,我的EDMX文件在我的DAL层上。 因此,用户界面将直接访问我的DAL。感谢。

5 个答案:

答案 0 :(得分:11)

这取决于客户端与对象域的接近程度。如果它是您的客户,那么可能 - 实际上这几乎就是ADO.NET数据服务(等)如何工作 - 直接暴露您的模型。

但是,如果客户其他,我建议使用专用的DTO。事实上,无论如何我都会建议它;否则,它会变得有些复杂:

  • 控制序列化细节(什么成员?什么名字?当我们发布它时会发生什么?)
  • 处理关系属性(它一个Orders成员......但是这是懒惰加载的吗?我们想要吗?)
  • 将传入的对象(用于更新等)合并回模型
  • 在反序列化期间禁止您在setter等中添加的任何逻辑
  • 如果在DataContractSerializer
  • 等基于树的序列化程序中获得同一对象的2个单独副本,则处理身份管理

在大多数情况下,拥有一个单独的DTO可以解决大部分问题消失

答案 1 :(得分:10)

基本上,我不认为将DAL对象发送到您的界面是个好主意,所以我会使用DTO。为了尽量减少这样做,我会看一下DTO generator来生成DTO代码,它允许您从DAL对象转换为DTO,反之亦然。

编辑:对不起,没看到你正在使用POCO。看看这个SO post

答案 2 :(得分:1)

首先,我相信您不能将实体框架生成的实体用作服务中的返回类型,至少在WCF服务中是这样。

但是,为什么要在整个应用程序中使用实体?如果您有一个具有客户端 - 服务器结构的通用体系结构,那么您的客户端将不需要EntityObject具有的所有信息,例如包含它的ObjectContext,其上的状态以及客户端的许多其他信息不会使用,但更重要的是:不必知道。

在这种情况下,您应该使用DTO模式或您认为更好的其他设计模式,将服务器端与客户端分离。我相信DTO Pattern是最广泛使用和推荐的。 如果您使用的是Entity Framework,可以转到http://entitiestodtos.codeplex.com,它是我发布的Visual Studio和AddIn,它是免费的开源软件。它从您的实体框架数据模型(EDMX)生成您的DTO。

此致 法比安·费南德兹

答案 3 :(得分:1)

DTO是一种很好的做法,可以最大限度地减少通过网络传输的数据量,只包含相关字段。这是其他好处之一。 Checkout Automapper和ProjectTo方法,可以自动将DAL转换为DTO,反之亦然。项目引擎盖下的项目将仅选择已配置映射中包含的列。

https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions

答案 4 :(得分:0)

首先使用实体​​框架代码TT,例如" EntityFramework Reverse POCO Generator" (https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator)  生成与单独的业务实体模型库中的数据库表模式关联的业务模型。可以修改TT以特别向WCF实体包含自定义属性(例如DataMember,Serializable)。

这种方式既可以带来DTO和EF POCO的好处。它可以轻松地保持业务模型实体和数据库表之间的一致性。

原因是,对于大多数情况,任何时候修改数据库表结构,开发人员还需要一致的业务模型结构(这里是DTO)。还有其他工作来维护映射器。

如果数据库访问层模型(这里的EF POCO)与DTO模型松散耦合。开发人员很难检测到在编译时间内无法显示的潜在错误,专门用于维护现有的企业级应用程序。

如果我们有业务模型实体所需的其他自定义属性,我们可以添加具有自定义属性的部分类。

我们仍然可以使用映射器在需要时将EF POCO实体转换为DTO实体。但我的观点是,与直接将数据绑定到EF POCO模型相比,尝试使用mappers来减少滥用,这只是重复工作。

由于我们可以在独立的业务模型库中生成EF POCO实体,因此DTO实体可以将它们保留在同一个业务模型库中。因此,开发人员可以更灵活地决定如何使用它们。