首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是在自定义orm中实现此关联场景的一种优雅方法吗?

这是在自定义orm中实现此关联场景的一种优雅方法吗?
EN

Stack Overflow用户
提问于 2016-08-24 00:05:32
回答 1查看 41关注 0票数 0

我正在使用Dapper构建一个自定义ORM。我有以下表格:

  • 用户
  • 角色
  • 权限
  • RolePermission

我的sproc有两个选择:一个用于基本用户信息,一个用于用户角色信息。基本用户信息被反序列化为用户对象。RolePermission信息被反序列化为自定义RolePermission对象,然后以编程方式与用户对象相关联。在自定义ORM中使对象图实现有多复杂?例如,EF采用了一种很好且简单的OO方法来获得角色名,如: User.UserRoles.Role.Name。但是,这是通过使用复杂而复杂的f/w来实现的,它基于db fk关联自动映射实体连接。它还附带了性能开销。我的想法是创建实体类,如下所示:

  • MyCompany.Entities.Entity.User.User
  • MyCompany.Entities.Entity.User.RolePermission

因此,我的RolePermission对象将完全定制为没有外部依赖关系的用户实体。这将使RolePermission对象在用户对象的上下文中保持尽可能轻量级。它不需要任何其他属性来支持其他实体/域/使用。这似乎是一种优雅的(简单、有效、高效)解决方案。对于这种在自定义ORM中创建复杂对象的方法,您有什么想法?

EN

回答 1

Stack Overflow用户

发布于 2016-08-24 16:33:41

我一直都在做这种事,这真的很容易。您将在两个查询中完成这一任务。这两个查询可以位于相同的sproc中,并返回不同的结果集,也可以是对数据库的两个单独调用。虽然我们使用mssql,但允许返回多个结果集,但我通常是这样做的。

因此,首先:您正在查询用户(浅)和用户的可选细节(包括角色信息(深度))。

代码语言:javascript
复制
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);
                }
            }
        }

几个注意事项:

  • dbo.udf_ConvertIntListToTable建立得很好,性能也很好。搜索网页,你就会找到它。如果你找不到的话,我会把它装成要点的。
  • RolePermission需要对外部用户有一个引用(我使用了UserId)。而且,该查询可能会映射您提到的其他数据(例如角色、权限等)。
  • 我有大量的扩展来整理上面的内容。我尽量保持原样,这样你就能看到发生了什么。
  • 现在您有了一个非常简单的列表查询(withDetails=false),还有一个更重的查询,所有数据都很好地封装在它的聚合根(用户)中。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39112485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档