2009-05-23 12 views
3

userIdによってUserテーブルへのFK、そしてenumの文字列値に対する文字列を持つUserPermissionsというテーブルがあります。Enumのリストのマッピング

私は見ていますエラーがNHibernate.MappingExceptionです:テーブルUserPermissionsから関連がマップされていないクラスを参照:GotRoleplay.Core.Domain.Model.Permission

私の許可の列挙:

public enum Permission 
{ 
    [StringValue("Add User")] 
    AddUser, 

    [StringValue("Edit User")] 
    EditUser, 

    [StringValue("Delete User")] 
    DeleteUser, 

    [StringValue("Add Content")] 
    AddContent, 

    [StringValue("Edit Content")] 
    EditContent, 

    [StringValue("Delete Content")] 
    DeleteContent, 
} 

私のUserクラス内のプロパティ:

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

私のデータベーステーブル:

CREATE TABLE dbo.UserPermissions 
(
UserPermissionId   int     IDENTITY(1,1) NOT NULL, 
UserId      int     NOT NULL, 
PermissionName    varchar (50)  NOT NULL, 

CONSTRAINT PK_UserPermissions PRIMARY KEY CLUSTERED (UserPermissionId), 
CONSTRAINT FK_UserPermissions_Users FOREIGN KEY (UserId) REFERENCES Users(UserId), 
CONSTRAINT U_User_Permission UNIQUE(UserId, PermissionName) 
) 

私のユーザーオブジェクトの権限のプロパティをマッピングでの私の試み:

HasManyToMany(x => x.Permissions) 
      .WithParentKeyColumn("UserId") 
      .WithChildKeyColumn("PermissionName") 
      .WithTableName("UserPermissions") 
      .LazyLoad(); 

を、私はそれが列挙型の値のリストへのアクセス権をマッピングすることができないことを間違って何をしているのですか?

+0

のためにここを見てデータ型として列挙型を使用するPermissionプロパティを持つUserPermissionsテーブル。これはうまくいきますが、パーミッションをロールとユーザに付けることができます。つまり、すべてのロールを含むユーザに割り当てられたすべてのパーミッションを取得する選択クエリは、複雑なlinq文のセットを必要とします。私はむしろそれをしないだろう。誰にでもアイデアはありますか? – Josh

答えて

1

自分の解決策として選択したコードを投稿すると思いました。唯一の回避策です。私はFluentがEnumリストをサポートしたいと考えていますが、それまでは可能な解決策があります:

The Enum - これは私のenumです。

public enum PermissionCode 
{ 
    //site permissions 1-99 
    ViewUser = 1, 

    AddUser = 2, 

    EditUser = 3, 

    DeleteUser = 4 
} 

次に、Permissionクラスがあります。

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

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

ご覧のとおり、私はIDと名前、そしてIDをPermissionCode enumに変換するプロパティを持っています。

public class PermissionMap : ClassMap<Permission> 
{ 
    public PermissionMap() 
    { 
     WithTable("Permissions"); 

     Id(x => x.PermissionId).GeneratedBy.Identity(); 

     Map(x => x.PermissionName); 
    } 
} 

PermissionCodeプロパティが導出されているので、我々はマッピングで何もしない:

マッピングは次のようになります。あなたができるいくつかのわずかな変更で、名前の代わりに、整数値を使用したい場合は

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

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId) 
) 

:マッピングの背後にある

私のテーブルの構造は次のようになります。それはあなたの個人的な好みによります。ここ

1

NHibernateがテーブル内の値をPermission列挙のメンバに変換できるように型を指定する必要があります。追加するには、編集

HasManyToMany(x => x.Permissions) 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("PermissionName") 
     .WithTableName("UserPermissions") 
     .LazyLoad() 
     .CustomTypeIs(typeof(Permission)); 

: ごめんなさい、私はあなたが多対多としてこれを持っていたことに気づいているはずです。それは不可能です:Usersコレクション(m:mの反対側)はenumにぶら下がります。これを1:mとして定義するか、またはPermissionテーブルを作成してm:mというクラスとマップを作成する必要があります。

+0

あなたの提案を使用しようとしましたが、CustomTypeIsは有効なオプションとして存在しません。代わりに.CollectionType(typeof(Permission))を使用してみましたが、同じエラーが表示されます。UserPermissionsテーブルの関連付けがマップされていないクラスを参照しています。GotRoleplay.Core.Domain.Model.Permission – Josh

3

は私のために

HasMany(x => x.Licences) 
       .WithTableName("DriverLicence") 
       .AsElement("Level").AsBag(); 

を働いていた方法ですので、工夫をたくさんした後、私はUserPermissionと呼ばれる新しいオブジェクトを作成し、それをマップするためになってしまったより多くの情報answer

+0

あなたの投稿をありがとう。私はそれを試してみましょう! – Josh

関連する問題