2009-08-18 1 views
0

私の現在のリポジトリは次のようになります私のNHibernateはリポジトリにUpdateメソッドを作成

public interface IRepository<T> 
    { 
     T GetById(int id); 
     ICollection<T> FindAll(); 
     void Add(T entity); 
     void Remove(T entity); 
    } 

どのように私はupdateメソッドを作成するのでしょうか?

データベースに書き込むためにflushまたはtransaciton commitを呼び出さなければなりませんか?

オブジェクトを更新して、saveorupdate()を呼び出そうとしました。 dbの値は変更されませんでした。

答えて

1

私たちのリポジトリには実際にAddメソッドがありません。代わりに、Saveメソッド(名前に恋をしていない)だけがあります。このメソッドはSession.SaveOrUpdate()を実行します。これは、定義に保存されていない値が指定されているためです。

データベースの実際の変更を見ると、これはセッションを閉じるまで発生しません。これは、NHibernateが絶対に必要とするまで作業をしないように保存します。

あなたが戻ってあなたのデータベースからIDを取得したいが、それはアイデンティティはあなたがいないNHibernate Avoid Identity Generator When Possible

3

が好まれていないのはこのためだ場合、あなたが今までにフラッシュする必要があるだろう唯一の理由です。 リポジトリパターンは意味:あなたがこれを行うと、私はList<T> のようなものを意味し、通常のコレクションで 「永続性の使用のための通常のコレクションをエミュレート」:

var list = new List<User>(); 
list.Add(myUser); 
myUser.MyProperty = newValue; 

MYPROPERTYリストとMYUSER変数の両方で利用者のためにこれは同じ参照であるため、newValueに設定されています。

var list = new List<User>(); 
list.Add(myUser); 
myUser.MyProperty = newValue; 
list.Update(myUser); 

リポジトリは、リストのように他のコレクションと同じように動作する必要があります。明示的な更新が必要なときは、それをリポジトリと呼んではいけません。コレクションはそのようには機能しません。

質問に答えるには:はい、トランザクションをコミットするか、セッションをフラッシュしてデータベース内のセッションの変更を維持する必要があります。リポジトリーの代わりにこれを担当する作業単位を作成し、セッションの代わりに作業単位をリポジトリーに注入する方がよい場合があります。

+0

ええと、私はデータレイヤーを作成しています。私は他の操作から更新を分離したくありません。私は自分のUserRepositoryに、ユーザーエンティティのためのすべてのDB操作を含むようにしたい。 – mrblah

+0

私は、アップデートを別にしているわけではありませんが、全くアップデートしていないことを意味します。エンティティの値を変更すると、自動的に更新が行われます。 NHibernateの使用を開始したときに私も明示的な更新を使用しましたが、削除することが可能であることを見てリポジトリのインターフェイスを変更し、呼び出しコードで多くの更新呼び出しを削除しました。コードの削除を開始しました。 – Paco

関連する問題