2014-01-17 92 views
0

家長演員NHibernate的母公司兒童

public class ParentMap : Map<Parent> 
    { 
     public ParentMap() 
     { 
      DiscriminateSubClassesOnColumn<string>("Provider").Nullable(); 
     } 
    } 

孩子:

public class Child1Map : SubclassMap<Child1> 
{ 
    public FacebookAccountMap() 
    { 
     DiscriminatorValue("child1"); 
    } 
} 
public class Child2Map : SubclassMap<Child2> 
{ 
    public FacebookAccountMap() 
    { 
     DiscriminatorValue("child2"); 
    } 
} 
從服務

我得到的Parent但財產item.Provider等於childOne情況下,我怎麼能得到的Child1實例或Child2基於價值提供者提供者

+0

可能重複(http://stackoverflow.com/questions/1664936/nhibernate-inheritance-discriminator-value) –

+0

我不需要任何默認值,我想被允許力量變化鑑別器,即使任何類別不支持這一個 – Roar

+0

我不明白你對英語的使用,但我刪除了答案,以便其他人仍然會看到這個問題。也許別人會比我更明白 –

回答

0

你的問題恐怕還不是完全清楚,但我會採取一種猜測:

最有可能你沒有收到家長的實例,但ParentProxy的情況下,一類NHibernate的生成從Parent繼承的。這個類不能轉換爲Child1,但實際上包含的一個Child1類的實例。方法調用被轉發到這個包含的類。這種機制是NHibernate的延遲加載系統的一部分 - 因爲NHibernate需要創建代理對象而不加載完整的對象數據,所以它不知道使用哪種確切類型。

如果您通過遵循來自其他某個類的引用來獲取該實例,則會發生這種情況。

的想法通常是:

  1. 你通常不需要投。如果你需要從基類轉換爲子類,你還沒有成功創建一個好的面向對象的設計,你應該探索方法來避免轉換(因爲繼承結構意味着調用者不需要關心實際的子類,投射需要違反了這一原則,因此應儘可能避免)。
  2. 如果您確實必須訪問真實的Child1實例,則可以使用provide an As<T>() method in the base class
[NHibernate的傳承 - 鑑別器 - 值]的