2009-11-25 124 views
2

我正在嘗試做以下操作,但它抱怨說「引用的類擴展了'未找到」。我想我需要有針對每個具體類型組件的映射,但我不能指定Attributes.Class兩次..使用NHibernate映射泛型類

的代碼如下:

[NHibernate.Mapping.Attributes.Class(Table = "Components", Abstract = true, 
    NameType = typeof (Component<ContentItem>))] 
public abstract class Component<T> : IComponent<T> where T : ContentItem 
{ 
    ... 
} 

[NHibernate.Mapping.Attributes.JoinedSubclass(Table = "ComponentA", ExtendsType = typeof(Component<ItemA>))] 
public class ComponentA : Component<ItemA> 
{ 
    ... 
} 

[NHibernate.Mapping.Attributes.JoinedSubclass(Table = "ComponentB", ExtendsType = typeof(Component<ItemB>))] 
public class ComponentB : Component<ItemB> 
{ 
    ... 
} 

哪裏意達和ItemB繼承ContentItem和所有映射。

回答

2

您不能映射像這樣的開放泛型類型,即具有未指定類型參數<T>的開放泛型類型。它只是不起作用。

Ayende在more detail on his blog中對此進行了討論。

+0

如果我按照這篇文章並在Component'1.hbm.xml文件中硬編碼信息,那麼它似乎工作正常。我只是不知道如何使用Mapping.Attributes註釋來做到這一點。令人討厭的是,T實際上並沒有映射到類中,因爲在這種情況下它不會被數據庫持久化。 – LucyB 2009-11-26 10:51:00

+1

因此,它聽起來像組件的持久性屬性實際上並不依賴於T.如果是這種情況,將它們分隔成一個ComponentBase(它被映射),從ComponentBase派生(它沒有映射),然後得到Component Component 類映射爲ComponentBase的聯接子類。 – 2009-11-26 17:15:09

+0

是的,這就是我最終做的。謝謝你的幫助。 – LucyB 2009-11-27 13:03:19