Я использую Fluent-NHibernate и пытаюсь сохранить иерархию объектов, используя таблицу для каждого метода подкласса:
public class AbstractProduct
{
public int ProductId { get; set; }
public string Name { get; set; }
}
public class SingleProduct : AbstractProduct
{
public int SingleProductId { get; set; }
public string SomeField { get; set; }
}
при сохранении объекта
var singleProduct = new SingleProduct();
session.SaveOrUpdate(singleProduct);
Я получаю эту ошибку:
NHibernate.Exceptions.GenericADOException: не удалось вставить: [FluentNHibernateSubClassTest.SingleProduct # 3] [SQL: INSERT INTO SingleProductData (Field1, AbstractProduct_id) VALUES (?,?)] ---> Система.Data.SqlClient.SqlException: Неверное имя столбца 'AbstractProduct_id'.
, несмотря на наличие следующих переопределений:
public class AbstractProductOverrides : IAutoMappingOverride<AbstractProduct>
{
public void Override(AutoMapping<AbstractProduct> mapping)
{
mapping.Id(x => x.ProductId).Column("ProductId");
//this mapping provided to illustrate the overrides are picked up
mapping.Table("ProductsData");
mapping.JoinedSubClass<SingleProduct>("ProductId");//ignored??
}
}
public class SingleProductOverrides : IAutoMappingOverride<SingleProduct>
{
public void Override(AutoMapping<SingleProduct> mapping)
{
mapping.Id(x => x.SingleProductId);
mapping.Table("SingleProductData");
mapping.Map(x => x.SomeField).Column("Field1");
}
}
Не похоже, какое имя столбца я предоставляюJoinedSubClass
игнорирует его и использует AbstractProduct_id
.
Как я могу сказать nhibernate, что ключевой столбец ProductId
, а не AbstractProduct_id
?
У меня есть тестовый проект, демонстрирующийпроблема доступна здесь (вам нужно создать БД)
ОБНОВЛЕНИЕ Я справился с этим, предложив следующее соглашение:
public class JoinedSubclassConvention : IJoinedSubclassConvention
{
public void Apply(IJoinedSubclassInstance instance)
{
if (instance.EntityType == typeof(SingleProduct))
instance.Key.Column(("ProductId"));
}
}
, который работает, но чувствует себя какНеправильный путь или взлом.