Сопоставление подкласса, на которое ссылается NHibernate, с Fluent

#nhibernate #fluent-nhibernate #subclass

#nhibernate #fluent-nhibernate #подкласс

Вопрос:

Я перепробовал много разных конфигураций сопоставления, но продолжаю генерировать исключения или создавать / обновлять неправильную запись.

Исключения

  • Невозможно вставить явное значение для столбца идентификатора в таблице
  • Невозможно использовать генерацию ключа столбца идентификатора с сопоставлением union-subclass
  • для класса XXX сгенерирован нулевой идентификатор

Когда у меня есть карта, которая сохраняет, у меня возникает следующая проблема

Я успешно вставил и обновил записи в базе данных, но у этих записей нет соответствующего идентификатора. Все они имеют 0 для идентификатора и поэтому обновляют одну и ту же запись снова и снова.

Проблема, которую я пытаюсь решить

Я пытаюсь подключиться к SubclassMap интерфейсу IRequest . Этот интерфейс используется как свойство отдельного класса AbstractWorkflowRequestInformation . При сохранении родительского класса я хочу сохранить ссылки IRequest в соответствующей таблице подклассов. Это мое текущее сопоставление, которое генерирует исключение Cannot insert explicit value for identity column in table . Я уверен, что у меня есть что-то измененное в том, как я отображаю отношения между этими двумя классами. Что я делаю не так? Мои карты приведены ниже.

IRequestMap

 public class IRequestMap : ClassMap<IRequest>
{
    public IRequestMap()
    {
        Id(x => x.WorkflowRequestInformation)
            .GeneratedBy.Foreign("AbstractWorkflowRequestInformation");
        UseUnionSubclassForInheritanceMapping();
    }
}

public class PlanRequestMap : SubclassMap<PlanRequest>
{
    public PlanRequestMap()
    {
        Table("plan_request");
        // specific to PlanRequest property mappings and references
    }
}

public class BnjRequestMap : SubclassMap<BnjRequest>
{
    public BnjRequestMap()
    {
        Table("scratchdb.guest.bnj_request");
        // specific to BnjRequest property mappings and references
    }
}
 

AbstractWorkflowRequestInformationMap

 public class AbstractWorkflowRequestInformationMap :
    ClassMap<AbstractWorkflowRequestInformation>
{
    public AbstractWorkflowRequestInformationMap()
    {
        Table("workflow_request_information");
        Id(x => x.Id)
            .Column("workflow_request_information_id")
            .GeneratedBy.Identity();

        // more property mappings and references
        References(x => x.SuperDuperRequest, "workflow_request_information_id")
            .Class<IRequest>().Unique().Cascade.All();
        // more property mappings and references
    }
}
 

Комментарии:

1. полное исключение помогло бы увидеть: какой идентификатор таблицы, при вставке какого объекта и так далее

Ответ №1:

Проблема здесь заключалась в том, что в моей карте IRequest отсутствовала ограничивающая ссылка на AbstractWorkflowRequestInformation. Итак, добавив свойство WorkflowRequestInformation и ограничение, теперь все работает так, как я предполагал.

 public class IRequestMap : ClassMap<IRequest>
{
    public IRequestMap()
    {
        // adding this fixed the problem
        HasOne(x => x.WorkflowRequestInformation).Constrained();
        // adding this fixed the problem

        Id(x => x.WorkflowRequestInformation)
            .GeneratedBy.Foreign("AbstractWorkflowRequestInformation");
        UseUnionSubclassForInheritanceMapping();
    }
}