私は NHibernate プロジェクトに取り組んでおり、一時的なエンティティの更新に関して質問があります。
基本的にワークフローは次のとおりです。
- DTO (プロジェクション) を作成し、ワイヤ経由でクライアントに送信します。これには、エンティティからのプロパティの小さなサブセットがあります。
- クライアントは変更された DTO を返送します
- DTO プロパティを適切なエンティティにマップし直して、NH によって UPDATE ステートメントを生成および実行できるようにします。
- エンティティを保存する
ポイント4は私が問題を抱えているところです。現在、session.Merge() メソッドを使用してこの更新を行うことができますが、更新する前に最初にデータベースからエンティティをロードする必要があります (2LC がないと仮定します)。そのため、select ステートメントと update ステートメントの両方が起動されます。
私がやりたいのは、エンティティの一時的なインスタンスを作成し、DTO から新しい値をマップしてから、変更したプロパティのみを使用して NH に SQL ステートメントを生成させることです。エンティティ ID と SET 句に必要な値は既にあるので、追加の選択は不要です。これはNHで可能ですか?
現在 session.Update() を使用すると、すべてのプロパティが update ステートメントに含まれ、DTO の一部ではない初期化されていないプロパティが原因で例外が発生します。
基本的に、どのエンティティ プロパティがダーティかを指定して、これらだけが更新に含まれるようにする方法が必要です。
==編集==
例えば...
public class Person
{
public virtual int PersonId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Nickname { get; set; }
public virtual string Surname { get; set; }
public virtual DateTime BirthDate { get; set; }
}
そしてテストケース。
// Create the transient entity
Person p = new Person()
p.id = 1;
using (ISession session = factory.OpenSession())
{
session.Update(p);
// Update the entity – now attached to session
p.Firstname = “Bob”;
session.Flush();
}
「UPDATE Persons SET Firstname = 'Bob' WHERE PersonID = 1」のような SQL ステートメントを生成したいと考えていました。代わりに、BirthDate が初期化されていないため、DateTime が範囲外の例外を受け取ります。BirthDate は SQL ステートメントには必要ないため、必要ありません。多分これは不可能ですか?
== /編集 ==
前もって感謝します、ジョン