1

私はこのようなデザインを持っています:

public class Employee {
    //...
}

public class Company {
    private IList<Employee> _employees;

    public IList<Employee> Employees {
        get { return _employees; }
        set {
            if (_employees == value) {
                return;
            }

            _employees = value;

            //Some logic here. Eg:
            //Raise PropertyChanged
            //Iterate over the new values to suscribe to some events, etc.
        }
    }
}

次のようなことをしようとすると:

var employees = session.Query<Company>().Fetch(x => x.Employees).ToList();

をスローしLazyInitializationExceptionます:

ローディング コレクションへの不正アクセス

私が見つけた唯一の回避策は、ロジックをメソッドに移動し、このメソッドをパブリック (および仮想) にして、のすべてのインスタンスに対してメソッドをemployees呼び出すことですが、リポジトリからそのメソッドを呼び出すので、それは好きではありません。

何か案は?

4

3 に答える 3

1

データベースからのデータのフェッチと制御ロジックを混在させています。データを単純な値オブジェクトにフェッチすることをお勧めします。その後、Company および Employee ロジックを含むクラスに変換します。このようにして、データ エンティティをそのデータに基づく機能から分離します。

于 2013-10-11T05:24:14.730 に答える
0

マッピングでコレクションアクセサーとして「プロパティ」を使用していると思います。そうであれば、コードがコレクションを変更しようとしたときに、説明した動作が予想されるものです。

ドメイン モデルでそのパターンを使用する場合は、NHibernate にプロパティ 'Employees' ではなくバッキング フィールド '_employees' を設定するように指示するために、コレクション アクセサーを 'field' に変更する必要があります (適切な命名戦略を使用)。

これにより、コレクションにアクセスしようとするコードがトリガーされなくなります。

于 2013-10-16T19:19:30.487 に答える