#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();
}
}