1

私はNHibernateを初めて使用し、NHibernateでの列挙型のマッピングに関して質問があります(流暢ではありません...)。

列挙は次のとおりです。

public enum Setting
{
    CreateUser,
    CreateRole,
    UpdateUser,
    UpdateRole,
    ...
} 

私はまた、3つの属性を持つ「ロール」と呼ばれるクラスを持っています:

public class Role
{
    long ID;
    string Name;
    ICollection<Setting> Settings;
}

このクラス ロールでは、この特別なロールのすべての設定を保存します。コレクションに 1 つの設定が含まれていない場合、ロールはこのアクションを実行できません。

私の問題は今、このクラスをどのようにマップするかです.... Set または Bag を介してこの関係をマップしようとしましたが、うまくいきません。

データベース スキーマを次のように想像できます。

+------------+    +------------+    +------------+
| Role       |    | Ref Table  |    | Settings   |
+------------+    +------------+    +------------+
| ID         | FK | Role_ID    | FK | ID         |
| Name       |----| Setting_ID |----| Name       |
+------------+    +------------+    +------------+

私は今のところ正しいですか?これを NHibernate でマッピングする方法を教えてもらえますか?

これまで、ありがとう

編集1:

別の列挙型クラス (ID、名前、および多くの静的メソッドを使用) の問題を解決しました。その後、Setting と Role の間に多対多の関係を実装しました。

4

2 に答える 2

2

FlagsAttributeここで列挙型とビットマスクの操作を使用することを検討してください。

NHibernateを整数のプライベートフィールドまたはプロテクトフィールドにマップし、クラスはSettingフラグから読み取られる値のコレクションを表すパブリックプロパティを公開します。

に慣れていない場合はFlagsAttribute、MSDN(http://msdn.microsoft.com/en-us/library/system.flagsattribute (v=vs.110).aspx)を確認してください。

基本的に、次のように機能します。

CreateUser = 1,
CreateRole = 2,
UpdateUser = 4,
UpdateRole = 8,
…

これらの値は任意の組み合わせで組み合わせることができ、整数として表すことができます。たとえば、CreateUser権限とUpdateUser権限を持つユーザーの値は5であり、これを他の設定の組み合わせで表すことはできません。

私の考えでは、このアプローチは両方の長所を提供します。

  • データベースとNHibernateには、整数列が1つだけあります。追加のテーブル、外部キー、コレクション、結合はありません。
  • コード内のパブリックインターフェイスはクリーンなままです。他のクラスがビットマスク操作を公開したり、要求したりすることはありません。

このアプローチが好ましくないシナリオは、「UpdateRole設定ですべてのユーザーを選択する」などの設定でクエリを実行する必要があるシナリオです。

于 2012-09-11T20:29:08.390 に答える
0

私は-私はテストしていません-設定のコレクションを次のようにマップできると思います:

<class name="Role" table="Role">

    <id name="ID" column="ID">
       <generator ... />
    </id>

    <property name="Name" column="Name"/>

    <set name="Settings table="Ref Table">
      <key column="Role_ID" />
      <element column="Setting_ID" type="int" />
    </set>
</class>

列挙型をDB内の整数としてマップします。これはおそらくベストプラクティスではありませんが、簡単にするためです。それ以外の場合は、NHでユーザー定義型を作成する必要があると思いますが、整数の数値をマッピングすることもできます。これを行うときは、コレクションを1つの要素(設定)を含むセットとしてマップする必要があることを定義できます。Settingこの場合、列挙型の数値を明示的に指定することに注意してください。

于 2012-09-11T20:26:33.417 に答える