2010-01-29 59 views
0

我試圖使用NHibernate的映射每個子類繼承結構的表看起來是這樣的:NHibernate的:表每個子類映射和新關鍵字

public class BaseClass 
{ 
    public virtual IColllection<BaseClassCollection> Collection { get; set; } 
} 

public class ChildClass : BaseClass 
{ 
    public new virtual ICollection<ChildClassCollection> Collection { get; set; } 
} 

我收到以下錯誤,當我嘗試從會話中獲取一個ChildClass:

「無法轉換'NHibernate.Collection.Generic.PersistentGenericBag類型的對象'1[BaseClassCollection]' to type 'System.Collections.Generic.ICollection 1 [ChildClassCollection]'。」

這是我的映射文件:

<class name="BaseClass" table="BaseClassTable"> 
    <bag name="Collection"> 
    <key> 
     <column name="BaseClassCollectionId" /> 
    </key> 
    <one-to-many class="BaseClassCollection" /> 
    </bag> 
    <joined-subclass name="ChildClass" table="ChildClassTable"> 
    <key> 
     <column name="BaseClassId" /> 
    </key> 
    <bag name="Collection"> 
     <key> 
     <column name="ChildClassCollectionId" /> 
     </key> 
     <one-to-many class="ChildClassCollection" /> 
    </bag> 
</class> 

我需要重寫基類集合屬性類型的一些方法,當我映射子類。這可能與NHibernate?

回答

0

我想你會得到這個工作的唯一辦法是,如果你做的東西沿着這些路線:

public class BaseClass<TChild> where TChild : BaseClassCollection { 
    public virtual ICollection<TChild> Collection { get; set; } 
} 

public class ChildClass<TChild> : BaseClass<TChild> where TChild : ChildClassCollection { 
    public override ICollection<TChild> Collection { get; set; } 
} 

public class BaseClassCollection { } 
public class ChildClassCollection : BaseClassCollection { } 

的問題是new關鍵字打破繼承,然後你的映射是依靠那的傳承。你真的應該避免在任何地方使用new,因爲它不是一個好主意;把NHibernate拿出來,你會得到不同的行爲,這取決於你如何施展你的課程;把它當作BaseClass,你會得到一些完全不同的東西,比如你把它作爲ChildClass

如果這不是您要找的答案,我會appologize,但我認爲如果您需要使用new關鍵字,則無法使其正常工作。

HTH Andy