Я пытаюсь реализовать свою иерархию объектов в одной таблице с помощью стратегии «таблица для каждого класса» в NHibernate. Я получаю сообщение об ошибке с моим сопоставлением 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>
Кто-нибудь есть идея о том, что я делать не так?
Думаю, это правильный ответ: вам нужно вложить элементы подкласса. Атрибут inherits предназначен для использования, если подклассы перемещаются в отдельный файл сопоставления. –
Проблема не в том, что класс не объявляется абстрактным (хотя и хорошим catch), но с подклассом, который не является вложенным. Спасибо за помощь. Меня это несколько застопорило на несколько дней. –