1

FluentNHibernateの自動マッピング機能を使用しています。規則を使用してデータベースマッピングをかなり近づけることができましたが、IAutoMappingOverrideが必要なことがいくつかあります。

レガシーシステムでは、NATURALキー「Code」を持つエンティティクラス「Campus」があります。このキーのOracleデータベースタイプはVARCHAR2(3 BYTE)です。私の慣習では自動生成された代理キーを想定しているため、これにはオーバーライドを使用しています。以下に示すように、Campusエンティティ(自然キーを含む)を参照する他のエンティティクラス(Buildingなど)があります。

<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)であり、これはOracleのStringのデフォルトのようですが、VARCHAR2(3 BYTE)である必要があります。

mapping.NaturalId関数があるのを見ましたが、これが正しく機能しているかどうかはわかりません。Idの代わりにこれを使用すると、マッピング例外が発生するためです。

このシナリオに対処する方法について助けていただければ幸いです。

よろしく、ライアン。

4

1 に答える 1

0

FNH は関連付けの反対側の列の型を VARCHAR として認識する必要があることに同意しますが、明らかにそうではありません。FNHメーリングリストで聞いてみる価値があるかもしれません

しかし、現在の問題を解決するために、Building のマッピング オーバーライドで、使用する列のタイプを正確に指定して (関数を使用してColumn())、その動作を自分で修正できると思います。

于 2011-07-11T20:50:21.093 に答える