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

Я использую Fluent NHibernate для сопоставления базы данных Oracle. Это устаревшая база данных, поэтому я не могу изменить все, что хочу.

Есть поле GUID, но ключи все еще составные (я изменю это, как только смогу, чтобы ключи не были составными, но я не могу сделать это прямо сейчас). GUID - это поле VARCHAR2 с этим макетом: 551608b1-275d-49f6-9561-44d01aacf23f . GUID не добавляется последовательностью в Oracle, но вставляется из кода (C # или VB.net)

Guid.NewGuid()

Я сопоставляю ключи следующим образом (VB.net):

With CompositeId()
   .KeyReference(Function(x) x.Well, "WellID")
   .KeyProperty(Function(x) x.GUID, "GUID")
   .KeyProperty(Function(x) x.SetDate, "SET_DATE")
End With

Или как это в C #

CompositeId()
   .KeyReference(x => x.Well, "WellID")
   .KeyProperty(x => x.GUID, "GUID")
   .KeyProperty(x => x.SetDate, "SET_DATE");

Отображение отлично работает, и объект такой, какой я его хочу, пока мне не нужно сохранить.

Когда я пытаюсь сохранить или обновить неизмененный объект

m_Session.SaveOrUpdate(obj)

Я получаю: ORA-02289: последовательность не существует

Проблема в том, что я не использую последовательность для генерации моего GUID? Как я могу преодолеть это?

Ответы [ 2 ]

0 голосов
/ 15 января 2016

Использование направляющих "нормально" В вашей сущности идентификатор должен иметь тип Guid:

public virtual Guid Id { get; private set; }

И в вашей ClassMap вы должны отобразить это так:

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidComb();

При этом будет использоваться рекомендуемый алгоритм гребенки для создания новых направляющих.

или

Id(x => x.Id) .Column("Id") .GeneratedBy.Guid();

для генерирования новых Guids с помощью System.Guid или

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidNative();

, если вы хотите, чтобы база данных генерировала Guid для вас.

0 голосов
/ 06 декабря 2011

РЕДАКТИРОВАТЬ: CompositeId не имеет метода GeneratedBy, как я думал, источником проблемы может быть сопоставление для метода KeyReference.Проверьте сопоставление класса Well, чтобы убедиться, что оно присвоено, поскольку для этого идентификатора недопустимо собственное удостоверение (последовательность Oracle в этом случае).

Вы должны сообщить NHibernate, что вы назначаете идентификатор вручнуюэта сущность.Попробуйте что-то вроде отображения, показанного ниже. Конечно, когда вы создаете новый экземпляр этой сущности, вам потребуется установить соответствующие значения для GUID & SetDate в вашем коде.Вам также нужно будет присвоить соответствующий экземпляр класса Well свойству Well.

CompositeId()
    .KeyReference(x => x.Well, "WellID")
    .KeyProperty(x => x.GUID, "GUID")
    .KeyProperty(x => x.SetDate, "SET_DATE")
    .GeneratedBy.Assigned();
...