Связанное с NHibernate сопоставление подклассов с помощью Fluent - PullRequest
0 голосов
/ 01 ноября 2011

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

Исключения

  • Невозможно вставить явное значение длястолбец идентификатора в таблице
  • Невозможно использовать генерацию ключа столбца идентификатора с сопоставлением подкласса объединения
  • пустой идентификатор, сгенерированный для класса 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 Ответ

0 голосов
/ 24 ноября 2011

Проблема заключалась в том, что в моей карте 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...