отображение nhibernate.JoinedSubClass (keyColumn) не относится к keyColumn - PullRequest
1 голос
/ 25 января 2012

Я использую 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"));
    }
}

, который работает, но чувствует себя какНеправильный путь или взлом.

1 Ответ

2 голосов
/ 26 января 2012

mapping.Id в SingleProductOverrides имеет недостатки.Подклассы не имеют своего собственного идентификатора, они наследуют идентификатор от своих базовых классов.Даже mapping.JoinedSubClass<SingleProduct>("ProductId"); является избыточным (вероятно, игнорируемым), если SingleProduct также автоматизирован (это видно из переопределения для него).JoinedSubclassConvention - правильный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...