7

基本的に次のような単純なエンティティ クラスが WPF アプリケーションに含まれています。

public class Customer : MyBaseEntityClass
{
    private IList<Order> _Orders;
    public virtual IList<Order> Orders
    {
        get { return this._Orders; }
        set {this._Orders = new ObservableCollection<Order>(value);}
    }
}

また、オフライン ユーティリティで Fluent automapper を使用して、実行時に読み込まれる NHibernate 構成ファイルを作成しています。これはすべて正常に動作しますが、元のコレクションを NHibernate に戻していないため、明らかなパフォーマンス ヒットがあるため、NHibernate にコレクションを作成させるための規則を追加しようとしています。

public class ObservableListConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance)
    {
        Type collectionType =
            typeof(uNhAddIns.WPF.Collections.Types.ObservableListType<>)
            .MakeGenericType(instance.ChildType);
        instance.CollectionType(collectionType);
    }
}

ご覧のとおり、私は uNhAddIns コレクションの 1 つを使用しています。これは、規則と INotification の変更の両方をサポートするはずですが、何らかの理由でこれを行うと遅延読み込みが中断されるようです。このようなカスタム レコードを読み込むと...

var result = this.Session.Get<Customer>(id);

...その後、Orders フィールドには PersistentObservableGenericList 型のインスタンスが割り当てられますが、その EntityId フィールドと EntityName フィールドは null であり、注文を展開しようとすると、恐ろしい「読み込みコレクションへの不正アクセス」メッセージが表示されます。

私が間違っていること、および/またはこれを機能させるために何をする必要があるかを誰かに教えてもらえますか? 元のプロキシ オブジェクト (通常、Orders メンバーを遅延ロードするために必要な Customer ID を含む) が、正しいオブジェクトを追跡していない uNhAddIns コレクション項目に置き換えられていると仮定するのは正しいですか?

更新:この問題を示すテスト プロジェクトを作成しました。uNhAddins プロジェクトを直接参照していませんが、コレクション クラスは手動で追加されています。それがどのように機能するかは非常に簡単ですが、基本的にはドメインからデータベースを作成し、子リストを持つレコードを追加してから、子リストの実装としてコレクション クラスを使用して別のセッションにロードしようとします。遅延読み込みが失敗したため、アサートがスローされます。

4

1 に答える 1

1

私は最終的にこれに対する答えを自分で見つけました...問題はObservableListTypeの使用によるものでした。NHibernate セマンティクスでは、リストはエンティティの順序付けられたコレクションです。IList に何かを使用する場合は、順序付けられていないコレクション、つまりバッグが必要です。

このトピックに関する別の StackOverflow の質問への回答を読んだ後、私にとってユーレカの瞬間が訪れました。

于 2013-12-12T04:56:05.807 に答える