0

FluentnHibernateの奇妙な動作を目撃しています。この問題には、「Page」オブジェクトと「Metadata」オブジェクトの2つのオブジェクトが関係しています。ページには複数のメタデータオブジェクトを添付でき、マッピングは次のように行われます。

'in PageMap
HasMany(Function(x) x.MetaData).Cascade.All()
'in MetaDataMap
References(Function(x) x.Page)

保存プロセスで問題が発生します。ページオブジェクトへの変更を保存する場合は、既存のページオブジェクトを取得し、変更のリストを実行してから、Session.Update(Page)を使用して値を保存します。奇妙な動作は、データは保存されますが、ページのメタデータは2回保存されます。1回は期待どおりに保存され、もう1回はpage_idがnullの場合です。奇妙なことに、これはUpdateコマンドをコメントアウトしても発生するため、実際には更新がデータの保存を引き起こしているわけではありません。

コードをステップスルーしてデータを監視し、nHibernateを使用してPageオブジェクトにその詳細を使用させているところまでエラーを追跡しました。したがって、このメソッドを呼び出す前に、データベースにはMetdataの変更がまったく表示されていません。その後、DBは表示されません(ビジーです)が、返されるページにはメタデータが追加されています。getメソッドは次のようになります。

Public Function GetById(ByVal Id As Integer) As Cms.DataTransferObjects.Page Implements IPageManager.GetById
    Dim session As ISession = NHibernateSessionManagerStore.Instance.GetSession()
    Dim results As Cms.DataTransferObjects.Page

    results = session.CreateCriteria(Of DataTransferObjects.Page)() _
        .Add(Expression.Like("Id", Id)) _
        .UniqueResult(Of DataTransferObjects.Page)()

    Return results
End Function

したがって、データを保存しているものは明らかにありません。

誰かがこれに光を当てることができますか?それは私を凶暴に駆り立てています!

乾杯、マット

4

1 に答える 1

1

Updateインスタンスがすでにセッションにある場合は、呼び出す必要はありません。NHibernate は、オブジェクトに加えられたすべての変更を見つけて、データベースに保存するのに十分賢いです。インスタンスをセッションに入れるには、通常、クエリを使用して既存のオブジェクトを取得するかSave、新しいインスタンスを永続化します。Updateデタッチされたインスタンスにのみ役立ちます。

メモリ状態をデータベースに書き込むことをFlushing と呼びます。NH は、コミット前だけでなく、クエリの前にもフラッシュして、クエリが実際のデータに対して実行されるようにします (したがって、プロパティを "A" に設定すると、このプロパティを "A" でフィルター処理するクエリをすぐに作成できます。インスタンスを取得します)。

NH が null 外部キーを保存する理由がわかりません。どこかで外部キーを null に設定していませんか? インスタンスを別のものに「再利用」しようとしていますか?

于 2010-06-21T10:34:44.580 に答える