Я использую функцию автоматического сопоставления 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, я получаю исключение сопоставления.
Буду признателен за любую помощь в том, как справиться с этим сценарием.
С уважением, Райан.