我正在使用Dapper构建一个自定义ORM。我有以下表格:
我的sproc有两个选择:一个用于基本用户信息,一个用于用户角色信息。基本用户信息被反序列化为用户对象。RolePermission信息被反序列化为自定义RolePermission对象,然后以编程方式与用户对象相关联。在自定义ORM中使对象图实现有多复杂?例如,EF采用了一种很好且简单的OO方法来获得角色名,如: User.UserRoles.Role.Name。但是,这是通过使用复杂而复杂的f/w来实现的,它基于db fk关联自动映射实体连接。它还附带了性能开销。我的想法是创建实体类,如下所示:
因此,我的RolePermission对象将完全定制为没有外部依赖关系的用户实体。这将使RolePermission对象在用户对象的上下文中保持尽可能轻量级。它不需要任何其他属性来支持其他实体/域/使用。这似乎是一种优雅的(简单、有效、高效)解决方案。对于这种在自定义ORM中创建复杂对象的方法,您有什么想法?
发布于 2016-08-24 16:33:41
我一直都在做这种事,这真的很容易。您将在两个查询中完成这一任务。这两个查询可以位于相同的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);
}
}
}几个注意事项:
https://stackoverflow.com/questions/39112485
复制相似问题