數據操作,在這里主要介紹INSERT、UPDATE、DELETE。我們在使用NHibernate的時候,如果只是查詢數據,不需要改變數據庫的值,那么是不需要提交或者回滾到數據庫的。
一、INSERT
通過調用ISession.Save()方法,然后同步同步到數據庫。
Program.cs
class Program { static void Main(string[] args) { ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); ISession session = sessionFactory.OpenSession(); PersonModel p = new PersonModel(); p.Id = 5; p.Name = "郭嘉"; session.Save(p); session.Flush(); //執行此行代碼,才真正提交到數據庫 Console.ReadKey(); } }
輸出結果如下:
NHibernate執行了插入語句。
如果在添加的時候想知道NHibernate返回的Id以判斷添加是否成功,可以這樣寫:
public bool Add(Ad ad) { return (int)NHibernateHelper.GetSession().Save(ad) > 0; }
二、UPDATE
通過調用ISession.Update,同步到數據庫。
Program.cs
class Program { static void Main(string[] args) { ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); ISession session = sessionFactory.OpenSession(); PersonModel p = session.Get<PersonModel>(1); p.Name = p.Name + "Nhiberante修改名字!"; session.Update(p); session.Flush(); Console.ReadKey(); } }
輸出如下:
不知道為什么UPDATE語句為什么不顯示出來,但是數據庫已經更改了。
三、SaveOrUpdate
NHibernate能夠做到自動判斷是應該執行INSERT還是UPDATE。這就是SaveOrUpdate()方法,當我們執行這個方法的時候,NHibernate完成如下工作:
- 檢查這個對象是否已經存在Session中。
- 如果對象不在,調用Save(object)來保存。
- 如果對象存在,檢查這個對象是否改變了。
- 如果對象改變,調用Update(object)來更新。
Program.cs
class Program { static void Main(string[] args) { ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession()) { PersonModel p1 = session.Get<PersonModel>(1); p1.Name = p1.Name + "Nhiberante修改名字!"; session.SaveOrUpdate(p1); } using (ISession session = sessionFactory.OpenSession()) { PersonModel p2 = new PersonModel(); p2.Name = "曹仁"; session.SaveOrUpdate(p2); } Console.ReadKey(); } }
輸出如下:
UPDATE語句,一樣沒show,不知道什么原因,另外要注意的是,如果你配置了Id由數據庫生成,希望insert的數據,不要添加Id編號。否則SaveOrUpdate會報異常,有了Id,NHibernate會執行UPDATE,而數據庫沒有此行數據,因此報錯。
四、DELETE
查出一個對象,調用ISession.Delete(),同步到數據庫。
Program.cs
class Program { static void Main(string[] args) { ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); using (ISession session = sessionFactory.OpenSession()) { PersonModel p1 = session.Get<PersonModel>(1); session.Delete(p1); session.Flush(); } Console.ReadKey(); } }
數據庫顯示如下:
但是這種方法也有個問題,這種方法要先把這條記錄查出來(SELECT),然后映射成實體,然后再把實體傳回去執行刪除操作(DELETE)。這樣處理可能能夠解決緩存與數據庫同步等一系列問題。
HQL是NHibernate特有的操作語言,它能夠理解,既然能理解那么就能正常處理與緩存的關系(未實測),不過跟蹤了SQL語句,還是先查詢后刪除,唯一不同只是返回多了一個影響行數。
public int Delete(int Id) { int Count = NHibernateHelper.GetSession().Delete("from Ad ad where ad.Id = ?", Id, NHibernateUtil.Int32); NHibernateHelper.GetSession().Flush(); return Count; }
如果不使用NHibernate的緩存功能,可以考慮使用CreateSQLQuery的方式刪除,在這里忽略了。