1

ドメインオブジェクトに次のように公開されるプロパティがあります。

    public virtual IEnumerable<WorkPost> WorkPosts
    {
        get { return sheetPosts; }
        private set
        {
            Guard.AssertAssignableFrom(value, typeof (IList<WorkPost>));
            sheetPosts = value as IList<WorkPost>;
        }
    }

内部表現はであり、IList<WorkPost>ご覧のとおり、割り当てられた値(NHibernateからの遅延読み込みプロキシ)は正しいタイプにキャストされます。この実装は、NHibernateプロキシの内部表現に依存するため、口の中で悪い味を与えました。NHibernateがプロキシをリストとして生成することを確認するために、AsList()宣言を使用してプロパティの流暢なマッピングを作成しました。

        HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList();

しかし、これは私に要求よりも少し多くを与えました。なぜなら、リストのセマンティクスは、データベースモデルにいくつかの追加のフィールドといくつかの追加のクエリを追加するソートを意味するため(コミット時にソートフィールドが更新されるため)、上記の「AsList」はトーゴ。

プロキシを生成するときにNHibernateが返すインターフェイスのタイプを制御するにはどうすればよいですか?(注:IEnumerableプロパティの戻り値のタイプを変更することは、私が探している答えではありません:-))

4

1 に答える 1

1

並べ替えのセマンティクスが必要ない場合は、要素の重複を許可するかどうかに応じて、セットまたはバッグを使用する必要があります。詳細については、コレクションに関するドキュメントをご覧ください。

NHibernateは、コレクションのセマンティクスに非常に厳密です。

  • リスト(persists IList)は、重複を許可し、整数でインデックスを付けることができる順序付けられたコレクションです。
  • マップ(persists IDictionary)は、特定のタイプの一意のキーでインデックス付けされた順序付けされていないコレクションです。
  • セット(ISetIesi.Collectionsから永続化され、おそらくISetフレームワークのバージョン4に付属しているを使用します)は、重複を許可しない順序付けられていないコレクションです。
  • バッグ(永続的であるICollectionIList、インデックス作成の保証はありません)は、重複を許可する順序付けられていないコレクションです。
于 2010-01-06T17:43:03.710 に答える