2009-06-25 82 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