Я просмотрел много вопросов по SO и google относительно сопоставлений подклассов в nhibernate / fluent-nhibernate, и мне не удалось найти никого с той же проблемой, что и я. Я выполнил основные инструкции из вики-страницы fluent-nhibernate (http://wiki.fluentnhibernate.org/Fluent_mapping#Subclasses), но это не помогло.
У меня есть базовая сущность под названием Operation, с которой связана базовая таблица, затем у меня есть подтаблицы UnpaidCheque, Refund и т. Д. - первичный ключ для каждой из этих подтаблиц является внешним ключом, OperationId (PK) из Операционный стол.
Когда я создаю спецификацию постоянства и пытаюсь проверить свои сопоставления, он пытается сохранить все столбцы в таблице операций, а не сохранять в таблице операций, а затем сохранять определенные столбцы неоплаченного чека в таблице UnpaidCheque.
Ошибка:
could not insert: [UnpaidCheque][SQL: INSERT INTO Account.Operation (PaymentId, Amount, UnpaidOn, UnpaidByUserId, OperationType) VALUES (?, ?, ?, ?, 'U'); select SCOPE_IDENTITY()]
----> System.Data.SqlClient.SqlException : Invalid column name 'UnpaidOn'.
Invalid column name 'UnpaidByUserId'.
Как видите, он пытается сохранить значения в столбцах UnpaidByUserId и UnpaidOn, которые являются членами подтаблицы / класса, а не базы.
С другой стороны, тот факт, что он пытается вставить 'U' в столбец типа операции, указывает мне, что он, похоже, устанавливает правильное значение дескриминатора для типа класса. Единственное место, где я указал тип операции, - это вызов DiscriminatorValue () в карте классов, я не устанавливаю его явно где-либо еще.
Иерархия классов следующая:
public class Operation
{
public virtual long OperationId { get; set; }
public virtual string OperationType { get; set; }
public virtual long? PaymentId { get; set; }
public virtual decimal Amount { get; set; }
}
public class UnpaidCheque : Operation
{
public virtual DateTime UnpaidOn { get; set; }
public virtual long UnpaidByUserId { get; set; }
}
Отображения классов:
public class OperationMap : ClassMap<Operation>
{
public OperationMap()
{
Schema("Account");
Table("Operation");
LazyLoad();
Id(_ => _.OperationId).Column("OperationId").GeneratedBy.Identity();
Map(_ => _.PaymentId).Column("PaymentId").Nullable();
Map(_ => _.Amount).Column("Amount").Not.Nullable();
DiscriminateSubClassesOnColumn("OperationType");
}
}
public class UnpaidChequeMap : SubclassMap<UnpaidCheque>
{
public UnpaidChequeMap()
{
Schema("Account");
Table("UnpaidCheque");
LazyLoad();
DiscriminatorValue("U");
KeyColumn("OperationId");
Map(_ => _.UnpaidOn).Column("UnpaidOn").Not.Nullable();
Map(_ => _.UnpaidByUserId).Column("UnpaidByUserId").Not.Nullable();
}
}
Я не вижу ничего, что я сделал иначе, чем в примере, кроме добавления KeyColumn () в карту подклассов, однако я получаю то же сообщение об ошибке и без этого. Может ли кто-нибудь пролить свет на то, что я упустил, или на то, что я пытаюсь достичь, поддерживается nhibernate? Насколько я могу судить, так и должно быть.
Заранее спасибо!