Свободная ссылка на сущность NHibernate с естественным ключом

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

В устаревшей системе у меня есть класс сущности Campus с НАТУРАЛЬНЫМ ключом Code. Тип базы данных Oracle для этого ключа - VARCHAR2 (3 BYTE). Я использую для этого переопределение, так как в противном случае мои соглашения предполагали бы автоматически сгенерированный суррогатный ключ. У меня есть другие классы сущностей (например, Building), которые ссылаются на сущность Campus (с ее естественным ключом), как показано ниже.

<class name="Campus" table="CAMPUS" ... >
<id name="Id" type="String">
  <column name="camp_code" sql-type="VARCHAR2(3 BYTE)" />
  <generator class="assigned" />
</id>
<set name="Buildings" ...>
  <key foreign-key="buil_camp_fk">
    <column name="camp_code" />
  </key>
  <one-to-many class="Building" />
</set>
...
</class>

<class name="Building" table="BUILDING" ... >
...
<many-to-one class="Campus" name="Campus">
<column name="camp_code" not-null="true" />
</many-to-one>
...
</class>

Созданные мной сопоставления HBM кажутся правильными с учетом следующих переопределений:

Public Class CampusMappingOverride
Implements IAutoMappingOverride(Of Campus)

Public Sub Override(ByVal mapping As AutoMapping(Of Campus)) Implements IAutoMappingOverride(Of Campus).Override
  mapping.Id(Function(campus) campus.Id, "camp_code").CustomSqlType("VARCHAR2(3 BYTE)")
End Sub

End Class

Public Class BuildingMappingOverride
Implements IAutoMappingOverride(Of Building)

Public Sub Override(ByVal mapping As AutoMapping(Of Building)) Implements IAutoMappingOverride(Of Building).Override
  mapping.References(Of Campus)(Function(building) building.Campus, "camp_code")
End Sub

End Class

Однако экспорт схемы (база данных Oracle) неверен.

create table BUILDING (
   ...
   camp_code NVARCHAR2(255) not null,
   ...
)
create table CAMPUS (
   camp_code VARCHAR2(3 BYTE) not null,
   ...
   primary key (camp_code)
)

Как видите, building.camp_code - это NVARCHAR2 (255), который, кажется, является значением по умолчанию для String в Oracle, но должен быть VARCHAR2 (3 BYTE).

Я видел, что есть функция mapping.NaturalId, но не уверен, что она работает правильно, потому что, если я использую ее вместо Id, я получаю исключение сопоставления.

Буду признателен за любую помощь в том, как справиться с этим сценарием.

С уважением, Райан.


person Ryan.Bartsch    schedule 11.07.2011    source источник


Ответы (1)


Я согласен с вами, что FNH должен распознавать тип столбца другой стороны ассоциации как VARCHAR, но, по-видимому, это не так. Возможно, стоит спросить в списке рассылки FNH

но, чтобы решить вашу текущую проблему, я думаю, что при переопределении сопоставления Building вы можете точно указать, какой тип столбца использовать (используйте функцию Column()), чтобы вы могли исправить это поведение самостоятельно.

person J. Ed    schedule 11.07.2011
comment
Спасибо за ответ. Я посмотрю список рассылки FNH. Ваше здоровье. Я не думаю, что могу делать то, что мне нужно, используя функцию Column () в ManyToOneBuilder (Of TOther), поскольку она просто устанавливает имя столбца (которое я уже правильно установил). Для ManyToOneBuilder (Of TOther) нет функции CustomSqlType. Я заметил, что кто-то другой задал похожий вопрос. - person Ryan.Bartsch; 12.07.2011