3

Permissionsという列挙型があります。ユーザーには権限を割り当てることができます。または、権限をロールに割り当てることができ、ユーザーに役割を割り当てることができます。私は今、私はおよそ持っている私のコードで私はFluentNibernateとEnums

public static bool UserHasPermission(Permission.DeleteUser) 

のようなものを行うことができますので、アクセス権のために列挙型を使用したい

public virtual IList<Permission> Permissions { get; set; } 

ユーザーおよびロールは、両方のこのような性質を持っています私のenumで50の異なるアクセス権。私は、データベース内のミラーのセットを設定する必要がなかった場合、それはいいですね。私の列挙型は、次のようになります。

現在
public enum Permission 
    { 
     //site permissions 1-99 
     [StringValue("View Users")] 
     ViewUser = 1, 

     [StringValue("Add User")] 
     AddUser = 2, 

     [StringValue("Edit User")] 
     EditUser = 3, 

     [StringValue("Delete User")] 
     DeleteUser = 4 

     ... 

} 

、私はPermissionId(int型)とPermissionName(VARCHAR(50))である権限のためのテーブルを持っています。

ここに私のロールの表があります。ユーザー側は限り権限が行くとまったく同じである:

その後
CREATE TABLE dbo.Roles 
(
    RoleId      int     IDENTITY(2,1) NOT NULL, 
    RoleName     varchar (50)  NOT NULL, 

    CONSTRAINT PK_Roles PRIMARY KEY CLUSTERED (RoleId) 
) 

CREATE TABLE dbo.RolePermissions 
(
    RolePermissionId   int     IDENTITY(1,1) NOT NULL, 
    RoleId      int     NOT NULL, 
    PermissionId    int     NOT NULL, 

    CONSTRAINT PK_RolePermissions PRIMARY KEY CLUSTERED (RolePermissionId), 
    CONSTRAINT FK_RolePermissions_Roles FOREIGN KEY (RoleId) REFERENCES Roles(RoleId), 
    CONSTRAINT U_RolePermissions UNIQUE(RoleId, PermissionId) 
) 

、私は私がそれを必要とする場合でTBLE権限を持っていますが、私はちょうどRolePermissionsでidフィールドのいずれかをマッピングする方法を得ることはありませんかPermissionsテーブルをenumに戻します。

CREATE TABLE dbo.Permissions 
(
    PermissionId     int     NOT NULL, 
    PermissionName     varchar (50)  NOT NULL, 

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId) 
) 
  1. 私は表に列挙型をマッピングすることはできますか?
  2. マップする必要がありますか?または、私はPermissionsテーブルを取り出し、UserPermissionsとRolePermissionsでPermissionIdをintのままにして、enumにマップしますか?
  3. Permissionsテーブルを保持している場合、nhibernateがEnumのデータからPermissionsテーブルのデータを自動収集する方法はありますか?

は今のところ、私はこのようなもの以外の許可の列挙型へのマッピングを、持っていない:

An association from the table RolePermissions refers to an unmapped class: GotRoleplay.Core.Domain.Model.Permission

私が間違っているのは何:

HasManyToMany(x => x.Permissions) 
       .WithParentKeyColumn("RoleId") 
       .WithChildKeyColumn("PermissionId") 
       .WithTableName("RolePermissions") 
       .LazyLoad() 
       .Cascade.All(); 

は残念ながら、これはエラーが発生します列挙型で?列挙型が単一の値だけでなくオブジェクトの値のリストであるときに、fluentnhibernateでそれらを使用するための標準的な方法またはベストプラクティスがありますか?

答えて

0

他の開発者と話をしたり、オンラインで掘り下げたり、GoogleのFluentNHibernateグループに投稿したりして、私はenumのコレクションが現在正確にはサポートされていないことを発見しました。

私がやっていることを描いて、実際に考えていたのですが、私の唯一の選択は、クラスを使用することでした。しかし、私はコードで私のenumを使用したい、それは私に当たったときです。PermissionIdフィールドはintからenumに変換でき、逆もまた可能です。ビルドされたASP.NETプロバイダを使用してロールを管理するために、私はpermisを構築する管理ツールを書くことができます私の列挙体にあるものに基づいています。

まず、私は私の列挙型に名前を変更しました。

public enum PermissionCode 
    { 
     //site permissions 1-99 
     [StringValue("View Users")] 
     ViewUser = 1, 

     [StringValue("Add User")] 
     AddUser = 2, 

     [StringValue("Edit User")] 
     EditUser = 3, 

     [StringValue("Delete User")] 
     DeleteUser = 4, 
    } 

次に、新しいPermissionクラスを作成しました。このクラスはデータベースをミラーリングし、単なるint型のIDと文字列型の名前です。しかし、私はそのIDをPermissionCode enumに変換するプロパティを1つ追加しました。

public class Permission 
    { 
     public virtual int PermissionId { get; set; } 
     public virtual string PermissionName { get; set; } 

     public virtual PermissionCode PermissionCode 
     { 
      get 
      { 
       return (PermissionCode)PermissionId; 
      } 
     } 
    } 

はその後、私のユーザーおよびロールオブジェクトには、私が許可を参照して、私はまだブールUserHasPermission(PermissionCode.DeleteUser)のような対戦を行うことができます。

次にglobal.asaxで、Application_Startで、権限を再構築する必要があるかどうかを示すフラグをwebconfigで調べます。こうすることで、リビルドを有効にすることができます。必要な場合にのみ、エラーに対処する必要がある可能性があります。つまり、列挙型では1つのアクセス許可リストしか保持しませんが、これは理想的です。

全体的なアプローチは、私が望んだほど滑らかではありませんが、機能します。誰にも他の提案はありますか?

+1

よりよい解決策をお手伝いすることはできませんが、私はあなたが答えを見つけられたことをうれしく思っています。 – CalebHC

0

私が理解していることを確認するには、クラスの列挙型プロパティをデータベースのフィールドにマップするだけですか?それはそれだ場合は、ここでそれを行う方法の例です:その後

public class Toy { 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual ToyCondition Condition { get; set; } 
} 

public enum ToyCondition { 
    New, 
    Used 
} 

public class ToyMap : ClassMap<Toy> { 
    public ToyMap() { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Condition).CustomTypeIs(typeof(ToyCondition)); 
    } 
} 

あなたは、セットとToyCondition列挙型を使用しただけで、通常のようConditionプロパティと論理を行うことができます。条件フィールドのためのデータベースに

Toy newToy = new Toy(); 
newToy.Condition = ToyCondition.New; 
toyRepository.Save(newToy); 

、それはint型でなければなりません。私はこれが理にかなって、あなたの質問に答えることを願っています申し訳ありませんが、私は道のりです。

編集: 申し訳ありませんあなたはこの質問をしたことに気付きましたが、あなたと同じ回答をあなたに与えてくれました。私はあなたにこれを手伝ってくれるとは思わない。:(

+0

私の問題は、列挙型の単一のインスタンスではないということです。これは値のリストです。同じ方法でマップすることはできません。あなたがコレクションを持っている場合、CustomTypeIsは利用できません。 – Josh