库; POCO / Linq-to-Sql实体类之间的映射

时间:2011-01-21 16:39:07

标签: c# sql sql-server linq-to-sql repository

我正在使用Sql Express制作我的第一个数据库程序。目前我正在使用Linq-to-Sql进行数据访问,我的存储库类返回“实体”类型对象。含义;我扩展dbml实体类以用作我的业务对象类。现在我想让它更加分离;并有POCO商务对象。

这就是我想知道可能存在哪些不同解决方案的地方。在我看来,我需要在存储库中手动将property-by-property,每个实体类映射到域类。到目前为止,我有大约20个表,总共有几百列。现在..我只是想验证这是否仍然是您使用的常见/典型方法?如果有其他选择而没有引入过多的复杂性,那会是什么呢?

2 个答案:

答案 0 :(得分:4)

在手动创建映射之前,请查看AutoMapper

  

AutoMapper是一个对象 - 对象映射器。   对象 - 对象映射的工作原理   转换一个输入对象   键入一个输出对象   不同的类型。什么使AutoMapper   有趣的是,它提供了一些   有趣的约定   找出如何做的肮脏的工作   地图类型A到类型B.只要输入   B遵循AutoMapper的建立   惯例,几乎为零配置   需要映射两种类型。

答案 1 :(得分:0)

AutoMapper是用于执行类到级转换的好工具。但是,我正在考虑将Linq2Sql和AutoMapper结合起来的DAL,我在想为什么不选择Fluent NHibernate呢?它很容易设置,适用于任何数据库,包括SqlExpress,并且有一个Linq提供程序可以非常无缝地集成。所有这些都是免费的开源代码,并且非常常用,因此有充足的文档和支持。

如果您想继续使用Linq2Sql但拥有更全功能的域模型,您可以考虑从DTO中获取您的域模型。这将允许您在域中拥有业务逻辑,并将属性传递给DTO。但是,要了解Linq2SQL对象将无法直接转换为域对象;你需要一个域中的构造函数来获取DTO并将信息复制到域中(至少需要DTO到域的单向映射)。但是,域可以像DTO一样对待(因为类总是它的父级),因此不需要反向转换;只需将域类交给它期望DTO的存储库。