2016-11-09 12 views
1

私がしたいのは、保存時にエンティティをインターセプトして、いくつかの文字列のプロパティを切り詰めることです。NHibernate Interceptor - OnFlushDirty

Entityの場合はOnSave()がトリガーされますが、変更/アップデートの場合はEntityのトリガーではありません。

次に、OnFlushDirty()インターセプタがあります。しかし、私は本当にこれと混同しています。

だから私は次のように、エンティティを更新するには、エンティティのいくつかのプロパティを変更したい:だから問題は次である

public bool OnFlushDirty( 
      object entity, 
      object id, 
      object[] currentState, 
      object[] previousState, 
      string[] propertyNames, 
      IType[] types) 
{ 
     bool entityChanged = false; 
     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      var stringType = types[i] as NHibernate.Type.StringType; 

      if (stringType != null) 
      { 
       if(NeedTruncate(currentState[i])) 
       { 
         currentState[i] = Truncate(currentState[i]); 
         entityChanged = true; 
       } 
      } 
     } 

     return entityChanged; 
} 

this oneのようなブログでは、エンティティが変更されてデータベースに保存されるときにOnFlushDirty()が呼び出されるので、ここのプロパティの変更はデータベースに保存されません。

しかしgithab.ioマニュアルには書かれています:

インターセプタは は、データベースと永続オブジェクトの両方に反映されます検出されたcurrentStateのを、修正することができます。 すべてのフラッシュがデータベースとの実際の同期で終了することに注意してください。 で、新しいcurrentStateがオブジェクトに伝播されますが、 は必ずしもデータベースに(必ず)必要はありません。これは、インターセプタがpreviousStateを変更しないことを強く推奨しています( )。

また、言う:オブジェクトはフラッシュ時に、汚れたことが検出されたときに呼び出され

は、だから、僕は、正確に物体が汚いことが検出されたときに呼び出され

では、このマニュアルに係る

また

、変更がデータベースに保存されます何を意味するのかわかりませんすぐには必要ありません。

とにかく私のプロジェクトでこれをテストすることで、これが動作し、OnFlushDirty()が呼び出され、プロパティの値が変更されると、データベースに保存され、すべての縫い目がうまく機能します。

私の質問です:これは正しいですか?私が言ったように私は私のプロジェクトでそれをテストし、エンティティOnFlushDirty()を変更/更新するとプロパティが変更され、データベースにも保存されます。 これ、および弱いドキュメントのすべての理由から、これでいくつかの問題に遭遇できるかどうかわかりません。

答えて

2

同様のケースでは、インターセプタのメソッドFindDirtyをオーバーライドし、変更を加えたプロパティのインデックスの配列を返します(または、flushdirtyで変更する)。

あなたの場合、そのメソッドをオーバーライドして、そのメソッドをチェックして、切り捨てるべき文字列プロパティがあるかどうかをチェックできます。その場合は、それらのプロパティのインデックスを返します。

このようにすると、必要なときに常にOnFlushDirtyが呼び出されることを確認する必要があります。

次に、OnFlushDirtyは、そのメソッドの永続プロパティを変更した場合はtrueを返します。これは、ここに投稿されたコードでは表示できません。

+0

永続プロパティを変更した場合はtrueを返します。問題のコードを間違えてしまったので、今すぐ更新されたコードを確認してください。 プロパティを変更する必要がある場合に 'FindDirty'をオーバーライドしてプロパティを変更し、プロパティを変更した場合に' OnFlushDirty'から 'true'を返すとすぐに、' OnFlushDirty'が常に存在することを確認できますそれが必要なときに呼び出され、オブジェクト(Entity)とデータベース内のプロパティも更新されますか? – carpics

+0

ちょうど 'FindDirty'は' int [] 'intの配列を返します。どのようにそれをオーバーライドして' true'を返しますか? – carpics

+0

私の答えは少し更新されました。 FindDirtyメソッドでプロパティ自体を変更できるかどうかはわかりません。 –

関連する問題