我正在尝试使用NHibernate中的“每类层次表”策略在一个表中实现对象层次结构。我的NHibernate映射出现错误,可以通过一个简单示例轻松重现。错误是:

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


我可以使用以下域类来重现它:

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>


有人知道我在做什么错吗?

最佳答案

我对c#和NHibernate不太熟悉,但是您确定在映射中Activity应该设置为abstract="true"吗?看来Activity类不是抽象的。

RunningTalking不应位于Activity内部,否则不会保存StartTime。对?

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


无论如何,错误消息表明NHibernate正在尝试创建带有语句的查询。但是没有任何价值。基本上,它试图像

...
WHERE foo IN (null)


如果我正确解析了代码。当命中引发此错误时,您想做什么?

您是否已经尝试在休眠配置中启用这些功能以检查发生了什么?

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

关于c# - 如何使用表每个类层次结构策略在nhibernate中管理多级类层次结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1045573/

10-13 03:05