2012-05-09 40 views
0

嗨,我正在使用MVC3和用於數據庫通信,我正在使用NHIBERNATE
我在更新記錄時遇到問題。如何使用nhibernate更新記錄

首先session.SaveorUpdate不起作用 然後我嘗試下面的事情,但這個也沒有工作:(

public bool EditParentStudent(ParentStudent parentstudent) 
     { 
      log.Debug("Start"); 
      if (parentstudent == null) 
      { 
       throw new ArgumentNullException("parentstudent"); 
      } 
      ISession session = DataAccessLayerHelper.OpenWriterSession(); 
      ITransaction transaction = session.BeginTransaction(); 
      bool saved = false; 
      try 
      { 
       session.SaveOrUpdate(parentstudent); 
       transaction.Commit(); 
       saved = true; 
      } 
      catch (SessionException ex) 
      { 
       if (transaction != null && transaction.IsActive) 
       transaction.Rollback(); 
       log.Error(ex); 
      } 
      finally 
      { 
       if (transaction != null) 
        transaction.Dispose(); 

       if (session != null && session.IsConnected) 
        session.Close(); 
      } 
      log.Debug("End"); 

      return saved; 
     } 
+0

您絕對需要提供更多信息。什麼意思是「不起作用」?例外?什麼是錯誤信息?數據庫中沒有更改嗎?你如何測試它?你怎麼稱呼這個方法?預期的結果是什麼? ...? ...? –

回答

0

假設你的映射是確定的,如果你正在使用MVC3,那麼你應該把代碼內部控制器,例如

public ActionResult Edit(ParentStudent parentstudent) 
{ 
    //open session 
    // open transaction 
    //found existing data 
    var data = session.Query<ParentStudent>().Where(x=>x.Id == parentstudent.Id).FirstOrDefault(); 
    session.SaveOrUpdate(data); 
    transaction.Commit(); 
    //close transaction 
    //close session 

return View();  
} 

也許是更好地把這個代碼try catch塊內,捕捉可能是個例外,但我試圖使它儘可能簡單。

希望這有助於。

+3

您不需要已在會話中的SaveOrUpdate實體。查詢返回的實體已經在會話中,SaveOrUpdate只是沒有做任何事情。 –

2

如果你的實體是持久化的,你不需要明確地更新它。

using (var session = sessionFactory.OpenSesion()) 
using (var tx = session.BeginTransaction()) 
{ 
    // perform your insert here 
    tx.Commit(); 
}