2009-06-25 109 views
1

我想在NHibernate中使用「按類表層次結構」表策略在NHibernate中實現我的對象層次結構。我的NHibernate映射出現錯誤,可以通過一個簡單示例輕鬆地進行復制。錯誤是:如何使用每個類層次結構策略的表來管理nhibernate中的多級類層次結構?

public interface IActivity 
{ 
    Guid Id { get; set; } 
} 

public abstract class Activity : IActivity 
{ 
    public DateTime StartTime { get; set; } 
    public Guid Id { get; set; } 
} 

public class Running : Activity 
{ 
    public string Where { get; set; } 
} 

public class Talking : Activity 
{ 
    public string ToWhom { get; set; } 
} 

而下面的XML映射:

<?xml version="1.0" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="NHibernateTesting" 
        namespace="NHibernateTesting" > 
    <class name="IActivity" 
     lazy="false" 
     table="Activity" 
     discriminator-value="0" 
     abstract="true"> 
    <id name="Id"> 
     <generator class="guid" /> 
    </id> 
    <discriminator column="Type" type="Int16" /> 
    <subclass name="Activity" 
       discriminator-value="1" 
       abstract="true" 
       lazy="false"> 
     <property name="StartTime" /> 
    </subclass> 
    <subclass name="Running" 
       discriminator-value="2" 
       lazy="false" 
       extends="Activity"> 
     <property name="Where" /> 
    </subclass> 
    <subclass name="Talking" 
       discriminator-value="3" 
       lazy="false" 
       extends="Activity"> 
    <property name="ToWhom" /> 
    </subclass> 
    </class> 
</hibernate-mapping> 

有沒有人有什麼我的想法

System.NotSupportedException: Attempting to parse a null value into an sql string (column:activity0_.Type). 
at NHibernate.SqlCommand.InFragment.ToFragmentString() in InFragment.cs: line 109 
at NHibernate.Persister.Entity.SingleTableEntityPersister.DiscriminatorFilterFragment(String alias) in SingleTableEntityPersister.cs: line 551 

我可以用下面的領域類重現此做錯了?

回答

5

幾乎沒有代碼映射的80%,是非常有用的默認我不是熟悉c#和NHibernate但你確定Activity應該在映射中設置爲abstract="true"?它看起來像Activity類不是抽象的。

不應該RunningTalking駐留在Activity之內,否則StartTime將不會被保存。對?

<subclass name="Activity" 
... 
    <subclass name="Running" 
    ... 
    </subclass> 
    <subclass name="Talking" 
    ... 
    </subclass> 
... 
</subclass> 

總之errormessage的該建議的NHibernate正試圖與在語句來創建一些查詢。但是它沒有價值。基本上它試圖像

... 
WHERE foo IN (null) 

如果我正確解析代碼。當碰撞拋出這個錯誤時你想做什麼?

您是否已經嘗試在hibernate配置中啓用這些功能來檢查發生了什麼?

<property name="show_sql">true</property> 
<property name="hibernate.format_sql">true</property> 
<property name="hibernate.use_sql_comments">true</property> 
2

afaik Table Per Class表示您在DB中獲得每個類的表格,並且從父表格中的1-1 FK到繼承表格。那麼不需要鑑別器。 你也不需要映射IActivity(除非你打算讓你的會話直接對它進行工作;那麼需要做一些調整)。

總之,我強烈建議你採取在FluentNHibernate偷看,這使得映射超級簡單,並且對所有

+0

我指的是每個class * hierarchy *的表,它有一個表用於整個類層次結構。 我其實看過Fluent NHibernate,但我正在學習它,所以我發現XML(和相關的手冊)更容易。我也有一個複雜的對象模型,我必須處理那些不正常的東西。 – 2009-06-25 19:09:51

+0

我想說,如果你還沒有這樣做,你最好的選擇是諮詢NH用戶組(nhusers @谷歌組)。他們在NH使用技巧上非常有幫助 – 2009-06-28 08:39:28