Свободная ссылка на сущность NHibernate с естественным ключом - PullRequest
1 голос
/ 11 июля 2011

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

В устаревшей системе у меня есть класс сущностей «Кампус», который имеет ЕСТЕСТВЕННЫЙ ключ «Код». Тип базы данных 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, я получаю исключение для сопоставления.

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

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

1 Ответ

0 голосов
/ 12 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...