すでに存在するかどうかに関係なく、データベースに行を書き込む必要があります。NHibernate を使用する前は、これはストアド プロシージャで行われていました。プロシージャは更新を試行し、行が変更されていない場合は挿入にフォールバックします。アプリケーションはレコードが存在するかどうかを気にしないため、これはうまく機能しました。
私が見つけた NHibernate のソリューションでは、エンティティをロードして変更するか、エンティティを削除して新しいエンティティを挿入できるようにする必要があります。アプリケーションは、レコードが既に存在するかどうかを気にする必要があります。それを回避する方法はありますか?
IDは重要ですか?
割り当てられた ID
オブジェクトには割り当てられた ID としてキーワードがあり、テーブルの主キーです。
SaveOrUpdate() は Id に基づいて Save() または Update() メソッドを適切に呼び出すことを理解しています。割り当てられた ID を使用すると、ID が保存されていない値ではないため、これは機能しません。ただし、代わりに Version または Timestamp フィールドをインジケータとして使用できます。実際には、メモリ内のオブジェクトがデータベース内のレコードに関連付けられているかどうかのみが反映されるため、これは関係ありません。レコードがデータベースに存在するかどうかは示しません。
生成された ID
割り当てられた ID が本当に問題の原因である場合は、キーワードの代わりに生成された ID を主キーとして使用できます。これにより、事実上常に挿入されるため、NHibernate の挿入/更新の問題が回避されます。ただし、キーワードの重複を防ぐ必要があります。キーワード列に一意のインデックスを使用すると、主キーが異なっていても、重複するキーワードに対して例外がスローされます。
別のアプローチ?
おそらく問題は実際には NHibernate にあるのではなく、これがモデル化されている方法にあります。アプリケーションの他の領域とは異なり、これはオブジェクト中心ではなくデータ中心です。NHibernate によって読み書きが簡単になり、ストアド プロシージャが不要になるのは素晴らしいことです。しかし、既存の値に関係なく単純に記述したいという欲求は、オブジェクトのアイデンティティ モデルのモデルにうまく適合しません。これにアプローチするより良い方法はありますか?