2012-05-30 30 views
2

我有一段向實體集合(一對多關係)添加元素的代碼。這是ISession.SaveNHibernate中的ISession.Save/Update和ITransaction.Commit之間的區別

 using (ISession session = sessionFactory.OpenSession()) 
     { 
      var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault(); 
      foreach(var themeId in selectedThemes) 
      { 
       var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault(); 
       if (selectedTheme != null) 
       { 
        package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme }); 
       } 
      } 
      session.Save(package); 
     } 

版本和該版本並沒有爲我工作。正如我曾與ITransaction測試寫的,我改變了它一點點以下:

 using (ISession session = sessionFactory.OpenSession()) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault(); 
      foreach(var themeId in selectedThemes) 
      { 
       var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault(); 
       if (selectedTheme != null) 
       { 
        package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme }); 
       } 
      } 
      transaction.Commit(); 
     } 

,現在它的工作原理。元素在package.Themes集合被存儲在數據庫中。怎麼來的?謝謝!

+0

我認爲在這個Q中接受的答案可能有所幫助:http://stackoverflow.com/questions/1332849/nhibernate-session-save-and-transaction-commit – SpaceBison

回答

7

比較蘋果和橘子!

  1. 保存()會告訴NHibernate「這個對象應該是持久的」。恰好當INSERT語句發出時沒有定義,並且可能會在一段時間後發生。
  2. 根據級聯設置,保存()可能是不必要的。
  3. 您應該總是使用交易。
  4. 在事務提交和查詢時,如果髒狀態可能會影響查詢的結果,默認情況下會將髒狀態刷新到實際數據庫。

情況1中發生的情況可能是從未觸發刷新操作。在情況2中,由於級聯集合可能會保存項目,而事務提交會觸發刷新。