我数据库中的每个表都有它自己的 POCO
类。现在,我已经开始编写复杂的 SQL 连接,查询结果集应该映射到一些可以发送到业务管理器(另一层)以进行进一步处理的实体。例如,假设我的查询返回这样的列(为简单起见,表名以列名为前缀):
Customer.CustomerId,
Customer.CustomerName,
Customer.CustomerAddress,
[User].UserId,
[User].UserName,
[User].FirstName,
[User].LastName,
UserRole.RoleId,
UserRole.RoleName,
Employee.EmployeeId,
Employee.EmployeeName,
Employee.JoinDate,
MAX(AuditTrail.LastLoginDate)
etc
问题:
- 我应该使用什么设计模式?
- 我应该能够编写多个查询,并在每个查询中检索到一堆混合和匹配列。也许,不是一个 将这种类型的结果集映射到 POCO 类是个好主意吗?
- 我可能有其他查询或多或少需要从 SQL 结果集中返回相同类型的列。
- 我是否应该维护单独的实体来支持查询?
注意:我正在使用 Dapper ORM 与带有 .NET 4.5 Framework (C#) 的 SQL Server 2012 通信。如果问题不清楚,请告知。
最佳答案
您要找的模式是Data Mapper
A layer of Mappers (473) that moves data between objects and a database while keeping them independent of each other and the mapper itself.
这意味着持久层之外的事物不应该知道任何关于数据库的信息——无论是 ORM 框架还是模仿表结构的 POCO。
因此,在 DDD 的上下文中,这意味着您使用域模型并将 DB POCO 映射到该域模型。数据映射器负责该映射。
实现
您当然可以自己进行映射:在数据映射器中创建一个方法,该方法采用 DB POCO 并返回相应的域对象。但是,如果您有很多映射,则这需要大量样板代码。
为了缓解这种情况,请使用像 AutoMapper 这样的对象到对象映射库.它减少了您为映射编写的代码量,还使映射更易于维护。缺点是你必须学习一个新的库并依赖它。
DB POCO 管理
您的 DB POCO(许多人称为 DTO)应仅服务于一个目的:描述 C# 世界中表或结果集的结构 - 仅此而已。所以是的,为每个返回不同结果结构的查询创建一个 DB POCO。
关于c# - 从表中查询数据时管理实体的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265230/