2017-05-05 4 views
0

状況

この時点で私が取り組んでいるプロジェクトでは、NHibernateをFluent NHibernateで使用しています。
Oracleデータベースはすでに存在しており、変更することはできません。NHibernateはForeignKeyプロパティを無視しています

私が抱えている問題は、Fluent NHibernateが次のコードサンプルのForeignKeyプロパティ/メソッドを無視しているようです。

Table("PERSON_PACKET"); 
Id(x => x.Id, "ID").GeneratedBy.UuidHex("N"); 

// Some Map(...) methods 

References(x => x.Packet) 
    .Column("PKT_IDENTIFICATION") 
    .ForeignKey("IDENTIFICATION") 
    .Cascade.None() 
    .Fetch.Select() 
    .Not.LazyLoad(); 

誰かがここで何が起こっているのか説明できますか?私はデータベースのこの

この部分をdiscoved方法

次の構造を有する:

ERD

は、すべての3つのこれらのエンティティが実際に閲覧していないテーブルが、その背後にあるテーブルです似ていますが。

PACKETビューには2つの同様のフィールドがあります。 1つは数字であるIDENTIFICATIONと呼ばれ、もう1つはIDENTIFICATIONで連結され、varcharであるIDと呼ばれるものです。
PACKET_PERSONPACKET.ID(そうしないPACKET.IDENTIFICATION)と同じ連結形式を有するカラムPKT_IDENTIFICATION

を有している奇妙なことは、間違った列がForeignKey方法であっても、上記のマッピングが働いています。このマッピングは2014年以来機能しています。
ForeignKeyメソッドをForeignKey("ID")に変更してみました。

最後に、方法をForeignKey("JUST_SOMETHING_THAT_IS_NO_COLUMN")に変更しました。

ここで何が起こっているか

答えて

2

スキーマ生成のためのメソッドがあると思います。私はそれがNH XMLマッピングの一部であるthisに等しいと思う。ドキュメントから

は... <one-to-one><many-to-one><key>、および<many-to-many>マッピング要素でそれを使用し、関連付けのために生成された外部キー制約の名前を指定します。

これは、観察可能な効果がないためです。マッピングファイルからデータベースを生成した場合は、JUST_SOMETHING_THAT_IS_NO_COLUMNという外部キー制約が表示されます。

スキーマを生成するつもりはない場合は、あなたのマッピングはなるかもしれない:

References(x => x.Packet) 
    .Column("PKT_IDENTIFICATION") 
    .Cascade.None() 
    .Fetch.Select() 
    .Not.LazyLoad(); 

がない悪影響で。

+0

あなたの答えをありがとう。その場合、このデータベースには外部キーの制約がなく、ビューにはプライマリキーがないので、NHibernateがどのカラムが参照されているかを知る方法は不思議です。 –

+0

NHibernateはデータベーススキーマを検査せず、気にしません。モデルとマッピングのみが重要です。それはそれが仕事をするために必要なものであると推測します。 –

+0

'Packet'のマッピングを使用してプライマリキーを作成し、指定した' PKT_INDENTIFICATION'カラムを使用して2つを結合します。 –

関連する問題