9

ドメイン モデル クラスは次のとおりです。

public abstract class BaseClass
{
...
}

public class ChildClass : BaseClass
{
...
}

親クラスは抽象的であり、流暢な nhibernate でマップするときが来ると、これがいくつかの問題を引き起こすことに注意してください。私の識別子はバイトです(DBのtinyint)。これは文字列ではなく、基本クラスに識別子の値を設定できないため、これは機能しません (BaseClass のマッピング クラスから取得)。

DiscriminateSubClassesOnColumn<byte>("Type")
    .SubClass<ChildClass>()
    .IsIdentifiedBy((byte)OperationType.Plan)
    .MapSubClassColumns(p => { ... })

私が得るエラーメッセージは次のとおりです。

クラスの初期化メソッド UnitTest1.MyClassInitialize が例外をスローしました。NHibernate.MappingException: NHibernate.MappingException: 識別子の値をエンティティ BaseClass の SQL 文字列にフォーマットできませんでした ---> System.FormatException: 入力文字列が正しい形式ではありませんでした..

次の投稿は、何が起こるかを説明しているようです。彼らはxmlで解決策を提供しますが、流暢なnhibernateでは解決しません: http://forum.hibernate.org/viewtopic.php?t=974225

助けてくれてありがとう。

4

1 に答える 1

13

回避策を見つけましたが、これはパッチのようです...マッピングファイルに次を追加しました:

SetAttribute("discriminator-value", "-1");

抽象基本クラスに文字列を使用しないようにFNHに指示しているようです(クラス名を使用していると思います)。-1 の値で機能させるために、ディスクリミネーターのタイプもバイトから sbyte に変更しました。

編集: 見逃しました:これは、デフォルト値を取る DiscriminateSubClassesOnColumn の 2 番目のパラメータです。したがって、私の質問に対する正しい答えは次のとおりです。

DiscriminateSubClassesOnColumn<sbyte>("Type", (sbyte)-1)
于 2008-11-28T19:04:59.293 に答える