我正在使用Dapper构建自定义ORM。我有以下表格:
我的sproc有2个选择:1表示基本用户信息,1表示用户角色信息。基本用户信息被反序列化为用户对象。 RolePermission信息被反序列化为自定义RolePermission对象,然后以编程方式关联到User对象。在自定义ORM中实现对象图的复杂程度如何?例如,EF采用一种简单易用的OO方法来获取角色名称:User.UserRoles.Role.Name。但是,这是通过使用复杂且复杂的f / w来实现的,该f / w基于db fk关联自动映射实体连接。它还带有性能开销。我的想法是按如下方式创建我的实体类:
因此,我的RolePermission对象将完全针对User实体进行定制,没有外部依赖关系。这将使RolePermission对象在User对象的上下文中保持尽可能轻量级。它不需要任何其他属性来支持其他实体/域/用法。这似乎是一种优雅(简单,有效,高效)的解决方案。您对在自定义ORM中创建复杂对象的此类方法有何看法?
答案 0 :(得分:0)
我一直这样做,这真的很容易。你将在两个查询中完成。这两个查询可以在同一个sproc中并返回不同的结果集,也可以是对数据库的两个单独调用。我通常使用后者,即使我们使用mssql,它允许返回多个结果集。
首先关闭:您正在查询用户(浅层)以及用户的详细信息,包括角色信息(深层)。
public IEnumerable<User> GetUsers(int? userID, bool withDetails)
{
var users = db.Query<User>(@" select *
from dbo.Users u
where (@userID IS NULL OR u.Id = @userID)", new { userID });
if (withDetails)
{
var rolePermissions = db.Query<RolePermission>(@" select *
from dbo.RolePermissions rp
where rp.UserId IN (select val from dbo.udf_ConvertIntListToTable(@userId_list))", new { userId_list = String.Join(',', users.Select(s => s.UserId)) });
foreach(var user in users)
{
user.RolePermissions = rolePermissions.Where(w => w.UserId == user.UserId);
}
}
}
一些注意事项: