2014-01-21 41 views
1

我試圖用NHibernate更新我的記錄。直到現在我只創建了SELECT語句。現在我需要做一個更新,我似乎無法使其工作。NHibernate更新不起作用

這是我打來的簡化功能。

public void UpdateDataEditedInDrobneAwarieGrid() 
    { 
     using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 

        string query = "UPDATE [MESdb].[dbo].[LogIn] SET Uzytkownik='a..' WHERE ID=3"; 

       session.CreateSQLQuery(query); 

       transaction.Commit(); 
      } 
     } 
    } 

NHibernateHelper:

public class NHibernateHelper 
{ 

    private static ISessionFactory _sessionFactory; 

    private static ISessionFactory SessionFactory 
    { 
     get 
     { 
      if (_sessionFactory == null) 
      { 

       var NHibernateConfig = new Configuration(); 
       NHibernateConfig.Configure(HttpContext.Current.Server.MapPath(
       @"~\Models\NHibernate\hibernate.cfg.xml"), "MESdb"); 
       NHibernateConfig.AddDirectory(new System.IO.DirectoryInfo(HttpContext.Current.Server.MapPath(
       @"~\Models\NHibernate\Mapping"))); 
       _sessionFactory = NHibernateConfig.BuildSessionFactory(); 
      } 
      return _sessionFactory; 
     } 
    } 

    public static ISession OpenSession() 
    { 
     return SessionFactory.OpenSession(); 
    } 
} 

什麼可能是錯的任何想法?

SQL語句正常。在MSSQL服務器中檢查它。

回答

2

要執行更新作爲session.CreateSQLQuery(query);的一部分,我們必須明確地呼叫ExecuteUpdate();

session.CreateSQLQuery(query) 
    .ExecuteUpdate(); 
+0

這是專爲批量更新,而不是在持久對象設置屬性。應該檢索並更改持久對象,然後自動更新transaction.Commit() –

+2

@ErikHart此評論不屬於答案。它屬於這個問題。也是不正確的。對於批量更新,Erik,你應該檢查DML。 'CreateSQLQuery'對我們來說就是爲了快速訪問ADO.NET,同時還由NHiberante管理。簡而言之,在某些情況下,您無法使用映射。相信我,你遲早會面對的;) –

1

通常你會使用對象而不是編寫SQL工作,例如:

public void UpdateDataEditedInDrobneAwarieGrid() 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     var login = session.Get<LogIn>(3); 
     login.Uzytkownik = "a.."; 
     transaction.Commit(); 
    } 
} 
+0

請注意,你甚至不需要調用session.SaveOrUpdate(登錄),如果你只做一個更新(你只需要Save()新對象來將它們附加到會議)。許多人想知道爲什麼NHibernate更新數據庫上的對象,儘管從來沒有完成SaveOrUpdate。另一方面,即使使用SaveOrUpdate/Save(),更改也不會立即發送,但NHibernate會嘗試對它們進行批處理並通過Commit()方法連續發送它們。恭喜,您距離正確的NHibernate實現更近了一步,並且遠離常見錯誤和反模式! –