2011-12-06 21 views
0

私はFluent NHibernateを使用してOracleデータベースをマッピングしています。私は本当に私が望むすべてを変更することはできませんので、それはレガシーデータベースです。Fluent NHibernateでカスタムGUIDをマッピング

GUIDフィールドがありますが、キーはまだコンポジットです(できるだけ早くこれを変更して、キーがコンポジットではないが、今はできません)。 GUIDは551608b1-275d-49f6-9561-44d01aacf23fのレイアウトを持つVARCHAR2フィールドです。 GUIDは、Oracleのシーケンスによって追加、私は、このようなキー(VB.net)マップコード(C#またはVB.net)

Guid.NewGuid() 

から挿入されていない。

With CompositeId() 
    .KeyReference(Function(x) x.Well, "WellID") 
    .KeyProperty(Function(x) x.GUID, "GUID") 
    .KeyProperty(Function(x) x.SetDate, "SET_DATE") 
End With 

等これはC#

CompositeId() 
    .KeyReference(x => x.Well, "WellID") 
    .KeyProperty(x => x.GUID, "GUID") 
    .KeyProperty(x => x.SetDate, "SET_DATE"); 

マッピング作業がすばらしく、目的は私が保存する必要があるときと同じです。

私は変わらないオブジェクトに

m_Session.SaveOrUpdate(obj) 

を保存または更新するとき私が取得:ORA-02289: sequence does not exist

は、私は私のGUIDを生成するためのシーケンスを使用してはいけない問題ですか?どうすればこれを克服できますか?

+0

キーがコンポジットでないとこれは簡単になりますか? –

答えて

0

EDIT: CompositeIdには私が思ったようにGeneratedByメソッドがありません。問題の原因はKeyReferenceメソッドのマッピングかもしれません。 Wellクラスのマッピングをチェックして、そのIDに対してネイティブID(ケースではOracleシーケンス)が有効でないため、割り当て済みに設定されていることを確認します。

NHibernateに、そのエンティティのIdを手動で割り当てることを伝える必要があります。以下のようなマッピングを試してみてください。 もちろん、このエンティティの新しいインスタンスを作成する場合、は、コード内のGUID & SetDateに適切な値を設定する必要があります。また、適切なWellクラスインスタンスをWellプロパティに割り当てる必要があります。

public virtual Guid Id { get; private set; } 

そして、あなたのClassMapであなたはこのようにそれをマップする必要があります:GUIDを使用して

CompositeId() 
    .KeyReference(x => x.Well, "WellID") 
    .KeyProperty(x => x.GUID, "GUID") 
    .KeyProperty(x => x.SetDate, "SET_DATE") 
    .GeneratedBy.Assigned(); 
+0

私はIDのためにこれを行うことができますが、私もCompositeIDのためにそれを行うことができます知っている? Id(x => x.GUID、 "GUID")。GeneratedBy.Assigned(); –

+0

CompositeIdがNHibernateのIdのようになっていることについて悪い仮定をしました。私はその質問を編集した。 –

0

"通常" エンティティ内のIDは、タイプのGUIDである必要があります

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidComb();

これは、新しいGUIDを生成するために推奨されるくし型アルゴリズムを使用します。データベースがあなたのためにGUIDを生成するようにしたい場合は

または

Id(x => x.Id) .Column("Id") .GeneratedBy.Guid();

が可能System.Guid または

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidNative();

を使用して新しいGUIDをgenertaeします。

関連する問題