2009-08-18 38 views
0

我現在的庫看起來像是:創建更新方法在我的NHibernate的倉庫

public class Repository<T> : IRepository<T> 
    { 

     public ISession Session 
     { 
      get 
      { 
       return SessionProvider.GetSession(); 
      } 
     } 


     public T GetById(int id) 
     { 
      return Session.Get<T>(id); 
     } 

     public ICollection<T> FindAll() 
     { 
      return Session.CreateCriteria(typeof(T)).List<T>(); 
     } 

     public void Add(T t) 
     { 
      Session.Save(t); 
     } 

     public void Remove(T t) 
     { 
      Session.Delete(t); 
     } 


    } 

接口:

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

我將如何創建一個更新的方法?

是否必須調用flush或transaciton commit來寫入數據庫?我試圖更新一個對象,並調用saveorupdate();但它並沒有改變數據庫中的值。

回答

1

我們的存儲庫實際上並沒有Add方法。相反,我們只有一個Save方法(不喜歡這個名字)。該方法會執行Session.SaveOrUpdate(),因爲我們有定義未指定的未保存值,所以它可以正常工作。

就看到數據庫的實際更改而言,直到您關閉會話纔會發生。這樣可以節省NHibernate從事任何工作,直到絕對必要。

你會需要刷新的唯一原因是,如果你想獲得一個ID從數據庫回來,但它是這個原因,身份是不優選NHibernate Avoid Identity Generator When Possible

3

你不知道。 Repository模式的意思是:「模仿正常的集合持久使用」 正常的收藏,我的意思是這樣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包含用戶實體的所有數據庫操作。 – mrblah 2009-08-18 20:08:18

+0

我不是說有更新單獨,但完全沒有更新。只需在更改實體的值時自動發生更新。當我開始使用NHibernate時,我也使用了顯式更新,但是當我看到可以刪除它們時,我更改了存儲庫接口,在調用代碼中刪除了很多更新調用,並且應用程序仍然像以前一樣工作。開始刪除代碼。 – Paco 2009-08-18 21:39:44