1

nhibernate を使用して、ディスクリミネータに基づいて 1 つのテーブルから複数の異なる派生クラスにレコードをマップするシナリオがあります。

public class BaseClass { }

public class DerivedClass0 : BaseClass { }
public class DerivedClass1 : BaseClass { }
public class DerivedClass2 : BaseClass { }

次に、nhibernate の DiscriminateSubClassesOnColumn() メソッドを使用し、構成を変更して以下を含めます。

<subclass name="DerivedClass0" extends="BaseClass" discriminator-value="discriminator0" />
<subclass name="DerivedClass1" extends="BaseClass" discriminator-value="discriminator1" />
<subclass name="DerivedClass2" extends="BaseClass" discriminator-value="discriminator2" />

そのため、マップされると、これらのクラスは BaseClass ではなく派生クラスにキャストされます。

ただし、データベースには、対応するサブクラスを持たない識別子を持つレコードがいくつかあります。これらの場合、nHibernate はエラーをスローします。

"Object with id: 'xxx' was not of the specified subclass..."

エラーがスローされるのではなく、対応するサブクラスを持たないレコードが BaseClass にキャストされるように、これを処理する方法はありますか?

上記を可能な限り単純化しましたが、XML は動的に編集されることに注意してください。そのため、流暢な nhibernate [DiscriminateSubClassesOnColumn()] と XML を同時に参照しています。

次のこと (これは役に立ちます) はオプションではありません。

  • データを修正して無効なレコードを削除することはできません
  • サブクラスを持たないレコードのサブクラスを作成できません

nHibernate がディスクリミネーターにマップしようとして、ディスクリミネーターが存在しない場合を処理する必要があります。

4

1 に答える 1

1

解決策は、Fluent NHibernate マッピングで「AlwaysSelectWithValue()」メソッドを使用することです。

DiscriminateSubClassesOnColumn("discriminator").AlwaysSelectWithValue();

これにより、NHIbernate は、対応するサブクラスを持つデータベースからのみ結果をフェッチするようになります。

于 2013-10-10T09:22:24.820 に答える