2011-07-11 17 views
1

Fluent NHibernateオートマッピング機能を使用しています。私は慣習を使ってデータベースのマッピングをかなり近づけることができましたが、IAutoMappingOverrideが必要なものがいくつかあります。Fluent NHibernate参照元エンティティ(ナチュラルキー)

レガシーシステムでは、エンティティクラス「Campus」にNATURALキー「Code」があります。このキーのOracleデータベースタイプはVARCHAR2(3バイト)です。私の慣習は、そうでなければ自動生成された代理キーを想定しているので、私はこれを上書きしています。私は私が生成したHBMマッピングは、以下のオーバーライドを使用して、正しいと思われる

<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> 

以下のように(その自然キーを持つ)キャンパスエンティティを参照する他のエンティティクラス(例えばビル)を持っている:

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データベース)が正しくありません。あなたがbuilding.camp_codeを見ることができるように

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

は、Oracleでの文字列のデフォルトのようですNVARCHAR2(255)、であるが、それはVARCHAR2(3 BYTE)でなければなりません。

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

私はこのシナリオにどのように対処するかをお手伝いします。

親切に、 Ryan。

答えて

0

FNHは、関連の反対側の列の型をVARCHARとして認識する必要がありますが、明らかにそうではありません。 the FNH mailing list

で周りに依頼する価値があるかもしれませんが、あなたの現在の問題を解決するために、私はビルのマッピング・オーバーライドで、あなたがそう(Column()機能を使用)、正確にどのようなタイプの列の使用を指定することができると思いますあなたは自分でその行動を修正することができます。

+0

お返事ありがとうございます。私はFNHのメーリングリストを見ていきます。乾杯。 ManyToOneBuilder(Of Of)のColumn()関数を使用する必要があるとは思えません。これは単に列名を設定するだけです(これは既に正しく設定されています)。 ManyToOneBuilder(Of Of)のCustomSqlType関数はありません。私は他の誰かが同様の[質問](http://stackoverflow.com/questions/4588885/setting-customsqltype-on-references)を提起したことに気付きます。 –

関連する問題