5

Fluent/NHibernate の table-per-class 階層にマッピングの問題があります。データベースからレコードを取得すると、エラーが発生し続けます (間違った型の例外)。

ID 2445763 のオブジェクトは、指定されたサブクラス ClassA ではありませんでした (読み込みオブジェクトは間違ったクラス [ClassB] でした) (レコード 2445763 の [タイプ] 列の値は「2」です)

私のドメインには、EntryBase、ClassA、および ClassB があります。クラスは次のように定義されます。

public abstract class EntryBase 
{
    public virtual int Id {get;set;}
    public virtual string CommonProperty1 {get;set;}
    *... (lots of other common properties)*
    public virtual string CommonPropertyN {get;set;}
}

public class ClassA : EntryBase 
{
    public virutal string ClassAOnlyProperty {get;set;}
}

public class ClassB : EntryBase 
{
    public virutal string ClassBOnlyProperty {get;set;}
    public virutal int ClassBOnlyOtherProperty {get;set;}
}

マッピングは次のとおりです。

public class EntryBaseMap : ClassMap<EntryBase>
{
    public EntryBaseMap()
    {
        Table("MySingleTable");
        Id(x => x.Id, "RecordId").GeneratedBy.Identity();
        Map(x => x.CommonProperty1, "Field1Name");
        ...
        Map(x => x.CommonPropertyN, "FieldNName");
        DiscriminateSubClassesOnColumn<string>("Type");
    }
}

public class ClassAMap : SubclassMap<ClassA>
{   
    public ClassAMap()
    {
        DiscriminatorValue("1");
        Map(x => x.ClassAOnlyProperty);
    }
}

public class ClassBMap : SubclassMap<ClassB>
{   
    public ClassBMap()
    {
        DiscriminatorValue("2");
        Map(x => x.ClassBOnlyProperty);
        Map(x => x.ClassBOnlyOtherProperty);
    }
}

何が間違っているのでしょうか?クラス B のレコードを正しく格納できましたが、それらを取得すると、クラス A としてロードしようとしています。マッピングの問題ですか?

4

1 に答える 1

6

コメントで説明したように、単一のサブクラスを表すコレクション プロパティがある場合は、マッピングに where 句を追加する必要があります。

.Where("Type = '1'")

Typeは識別子の列で1あり、ロードしようとしているタイプに一致する識別子の値です。

于 2011-10-10T15:01:19.990 に答える