2016-08-24 12 views
0

私はDapperを使ってカスタムORMを構築しています。私は、次の表を持っている:これはカスタムormでこの関連付けシナリオを実装するためのエレガントな方法ですか?

  • ユーザー
  • 役割
  • 許可
  • をRolePermissionに

私SPROCが2つの選択があります。基本的なユーザー情報、ユーザー・ロール情報のための1のための1を。基本的なユーザー情報は、デシリアライズされてユーザーオブジェクトになります。 RolePermissionの情報は、デシリアライズされてカスタムのRolePermissionオブジェクトになり、次にUserオブジェクトにプログラムで関連付けられます。カスタムORMでオブジェクトグラフの実装をどの程度複雑にしますか?たとえば、EFは、User.UserRoles.Role.Nameのようなロール名を取得するために、すばらしく簡単なオブジェクト指向のアプローチを採用しています。しかし、これは、db fkの関連付けに基づいてエンティティ結合を自動的にマッピングする複雑で洗練されたf/wの使用によって実現されます。また、パフォーマンスのオーバーヘッドもあります。私の考えは次のように私のエンティティクラスを作成することです:

したがって
  • MyCompany.Entities.Entity.User.User
  • MyCompany.Entities.Entity.User.RolePermission

、私RolePermissionにオブジェクトう外部依存関係のないUserエンティティに完全に合わせる必要があります。これにより、RolePermissionオブジェクトは、Userオブジェクトのコンテキストでできるだけ軽量に保たれます。他のエンティティ/ドメイン/用途をサポートするための追加のプロパティは必要ありません。これは、エレガントな(簡単で効果的で効率的な)ソリューションのようです。カスタムORMで複雑なオブジェクトを作成するこのタイプのアプローチに関するあなたの考えは何ですか?

答えて

0

私はいつもこのようなことをしています。それは本当に簡単です。あなたは2つのクエリでそれを行います。 2つのクエリは同じsprocにあり、異なる結果セットを返すことも、データベースへの2つの別々の呼び出しにすることもできます。私は通常、複数の結果セットを返すことができる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); 
       } 
      } 
     } 

いくつかの注意事項:

  • dbo.udf_ConvertIntListToTableは非常によく確立され、偉大な実行しています。ウェブを検索すると、それを見つけることができます。あなたがそれを見つけることができなければ、私はそれを要点としてロードします。
  • RolePermissionは外部ユーザー(私はUserIdを使用)への参照を持つ必要があります。また、そのクエリでは、あなたが言及した追加データ(役割、権限など)をマッピングする可能性があります。
  • 私は上記をきれいにする拡張機能がたくさんあります。私はできるだけ生のままにしておいたので、何が起こっているか見ることができます。
  • リストなどに非常に軽いクエリ(withDetails = false)があり、すべてのデータが集約ルート(User)にうまくラップされている重いクエリがあります。
関連する問題