2009-08-08 55 views
0

我一直在使用joinedsubclass繼承映射一段時間,並決定切換到每班的表,因爲它允許更有效的子類型的歧視。但是,在進行更改時,我現在得到以下例外。流利Nhibernate WrongClassException與多態父

Object with id: 1 was not of the specified subclass: MyModel.FooBase (Discriminator was: '2') 

摘要類如下。

public abstract FooBase 
{ 
    /* snip other properties */ 
    public virtual string Name { get;set; } 
    public virtual IList<Child> Children { get; set; } 
} 

public class Bar : FooBase 
{ 
    public virtual string NickName { get;set; } 
} 

public class Child 
{ 
    public virtual FooBase Parent { get;set; } 
} 

而且映射

public sealed class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     /*snip*/ 
     References(x => x.Parent).ColumnName("ParentId"); 
    } 
} 
public sealed class FooBaseMap : ClassMap<FooBase> 
{ 
    public FooBaseMap() 
    { 
     /*snip*/ 
     HasMany(x => x. Children) 
      .AsBag().Cascade 
      .AllDeleteOrphan() 
      .KeyColumnNames.Add("ParentId") 
      .Inverse(); 

     DiscriminateSubClassesOnColumn<int>("FooType") 
      .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName)) 
    } 
} 

事實證明這個異常通常被認爲是多態的集合不指定其中的屬性。這裏不是這種情況。我曾經玩過讓FooBase不抽象,這沒有什麼區別。沒有想過改變映射策略會導致任何問題,除了必須在子類上有可爲空的列之外。

令人困惑的是我沒有指定一個子類,因爲這是一個多態的父親,我只是試圖在這種情況下訪問基本屬性Name。

非常感謝,

回答

3

好吧,我發現這個問題一如既往問的問題:(

反正它是用一個枚舉因爲這是問題的descriminator映射之後。

DiscriminateSubClassesOnColumn<int>("FooType") 
      .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName)) 

類型是一個枚舉,我曾經允許我不要忘記用作描述符的整數(因爲整數的原因是它們比db查找中的字符串快)

This問題意味着你可以直接使用Enums作爲descriminators自3892以來,所以我嘗試了。

DiscriminateSubClassesOnColumn<Types>("FooType") 
      .SubClass<Bar>(Types.Bar, m => m.Map(x => x.NickName)) 

沒有工作,所以我試圖

DiscriminateSubClassesOnColumn<Types>("FooType") 
      .SubClass<Bar>("Bar", m => m.Map(x => x.NickName)) 

還沒有爲低於該做的工作工作,所以我終於塵埃落定。

DiscriminateSubClassesOnColumn<int>("FooType") 
      .SubClass<Bar>((int)Types.Bar, m => m.Map(x => x.NickName))