2010-11-19 108 views
0

我有一個映射從抽象基類映射到具體聯合子類的多對一關係的問題。例如:映射NHibernate從抽象基類到聯合子類的多對一關係

public abstract class Entity 
{ 
    public virtual Guid ID {get; set;} 
    public virtual string Name {get;set;} 
    public virtual User OwnerUser {get; set;} 
} 

public class User : Entity 
{ 
    public virtual string UserName {get; set;} 
} 

正如你在這裏看到的,我有一個用於所有數據庫對象的基本抽象類。我將這些類映射爲Entity類作爲抽象映射類,將User作爲union-subclass。在創建配置對象時,不會引發任何錯誤,並且Schema導出正常。但是,OwnerUser的字段不會顯示在所有具體類的數據庫中。這裏是一個映射看起來如何的例子

<class entity-name="Entity" name="Entity" abstract="true"> 
    <id name="ID" type="guid"> 
     <generator class="guid.comb"/> 
    </id> 
    <property name="Name" /> 
    <many-to-one name="OwnerUser" column="ID" entity-name="User" /> 
</class> 

<union-subclass name="User" entity-name="User" extends="Entity"> 
    <property name="UserName" /> 
</union-subclass> 

我也使用Oracle XE實例作爲數據庫後端。如果這些信息不足以正確回答問題,請告訴我,我會盡我所能。

最糟糕的情況我只是明確地在所有的具體對象上添加多對一的關係,但這不是最優雅的解決方案,我認爲我提出的應該工作。我一直沒有找到任何具體的例子來說明各種互聯網的管道,也沒有在文檔中發現任何明確指出這是無效的用例,儘管我可能錯過了某些東西。這不會是第一次: -/

這個問題的任何答案,不勝感激。感謝您的時間。

回答

0

哇,只是...哇。

我沒有試圖刪除這篇文章,而是將它留給另一個低級的nhibernate noob來找到某一天,因爲我無法找到任何關於這個特定用例的問題。

事實是,你可以做到這一點沒有問題。我的問題是我在多對一的映射元素中爲列屬性指定了ID。出於某種奇怪的原因,我認爲這是外鍵引用的列(如果我沒有弄錯,這實際上是屬性參考)。該屬性實際上指定了包含引用的表中的列名稱(d'oh!)。令人驚訝的是,NHibernate會愉快地將多個映射元素映射到相同的列名,而不會有任何警告。我並不想責怪他們,或許這種用法是允許對多態派生類進行某種類型的覆蓋。

無論如何,這是一個有效的用例,並且將列屬性更改爲引用表中列的名稱工作正常。也許我本週每晚都在看比特和字節太久了...... 感嘆

謝謝大家花時間看看這篇文章。

相關問題