2

人を表すエンティティクラスと、人が持つ権限を表す列挙型があります。コードによるnhibernateマッピングを使用して、この関係をデータベースにマッピングしようとしていますが、成功しませんでした。

コードは次のようになります。

public enum Permissions
{
  None = 1,
  CanUpdate = 2,
  CanInsert = 3,
  CanDelete = 4
}

public class Person
{
   private ICollection<Permissions> permissions;

   public Person()
   {
      this.permissions = new Collection<Permissions>();
   }

   public virtual ICollection<Permissions> Permissions
   {
      get
      {
         return this.permissions;
      }
   }
}

public class PersonMap : ClassMapping<Person>
{
   public PersonMap()
   {
      this.Set(
        x => x.Permissions,
        m =>
          {
             m.Access(Accessor.Field);
             m.Key(k => k.Column("PersonId"));
             m.Table("PersonHasPermission");
          },
        map => map.Element(
        p =>
          {
             p.Column("PermissionId");
             p.Type<NHibernate.Type.EnumType<Permissions>>();
          }));
    }
}

データベーステーブルは次のようになります。

Person
-----------------------
PersonId (PK, uniqueidentifier, not null)
Name (nvarchar(max), not null)


PersonHasPermission
-----------------------
PersonId (PK, FK, uniqueidentifier, not null)
PermissionId (PK, FK, int, not null)

したがって、この構成では例外は発生しませんが、個人のアクセス許可を取得しようとすると、データベースにデータがある場合でも、コレクションは常に空になります。

上記のコードが私が達成しようとしていることを説明していることを願っていますが、さらに明確にする必要があるかどうかを知らせてください。

これに関する助けをいただければ幸いです。前もって感謝します。

4

1 に答える 1

0

私はXML構成を使用しており、保護されたメンバーやプライベートメンバーもマップできます。ですから、私にとって驚くべきことは、あなたが例外を受け取っていないということです。コレクションにはセッター(公開または保護)がないためです。NHibernate.PropertyNotFoundException:{"クラス'Person'でプロパティ'Permissions'のセッターが見つかりませんでした"}しかし 、流暢にマッピングをプロパティからフィールドに変換できる可能性があります。

パブリックセッターまたはフィールド(両方とも以下に表示)を使用してコードをテストしようとしましたが、機能しました。xmlマッピングのスニペットがあります:

<!-- public or protected setter -->
<bag name="Permissions" inverse="false" lazy="true" table="PresonHasPermission" cascade="all">
   <key column="PersonId" />          
   <element type="Permissions" column="PermissionId" />
</bag>

<!-- accessing the field -->
<bag name="permissions" inverse="false" lazy="true" table="PresonHasPermission" cascade="all"
   access="field" >
   <key column="PersonId" />          
   <element type="Permissions" column="PermissionId" />
</bag>

(フィールドにマッピングするときにクラス定義を変更しないままにします)

于 2012-11-02T17:46:52.777 に答える