nhibernate の初期化されていないプロキシに問題があります
ドメインモデル
2 つの並列クラス階層があるとします。Animal、Dog、Cat、および AnimalOwner、DogOwner、CatOwner で、Dog と Cat は両方とも Animal から継承され、DogOwner と CatOwner は両方とも AnimalOwner から継承されます。AnimalOwner には、OwnedAnimal というタイプの Animal の参照があります。
例のクラスは次のとおりです。
public abstract class Animal
{
// some properties
}
public class Dog : Animal
{
// some more properties
}
public class Cat : Animal
{
// some more properties
}
public class AnimalOwner
{
public virtual Animal OwnedAnimal {get;set;}
// more properties...
}
public class DogOwner : AnimalOwner
{
// even more properties
}
public class CatOwner : AnimalOwner
{
// even more properties
}
クラスには適切な nhibernate マッピングがあり、すべてのプロパティは永続的であり、遅延ロードできるものはすべて遅延ロードされます。
アプリケーションのビジネス ロジックでは、DogOwner に Dog を設定し、CatOwner に Cat を設定することしかできません。
問題
次のようなコードがあります。
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
このメソッドは、多くの異なる方法で呼び出すことができます。ほとんどの場合、犬は既にメモリ内にあり、すべて問題ありませんが、犬がまだメモリ内にないことはめったにありません。この場合、nhibernate の「初期化されていないプロキシ」を取得しますが、キャストがスローしますnhibernate は Dog ではなく Animal のプロキシを生成するため、例外です。
これが nhibernate の仕組みであることは理解していますが、オブジェクトをロードせずに型を知る必要があります。または、より正確には、初期化されていないプロキシが Animal のプロキシではなく、Cat または Dog のプロキシである必要があります。
制約
- ドメインモデルを変更できません。モデルは別の部門から渡されました。モデルを変更してもらいましたが失敗しました。
- 実際のモデルは例よりもはるかに複雑であり、クラス間で多くの参照が行われます。パフォーマンス上の理由から、熱心な読み込みを使用したり、クエリに結合を追加したりすることは問題外です。
- 私はソース コード、hbm マッピング、およびデータベース スキーマを完全に制御しており、(モデル クラス間の関係を変更しない限り) 好きなように変更できます。
- 例のようなメソッドがたくさんありますが、それらすべてを変更したくありません。
ありがとう、
ニル