日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate教程(5)--CRUD操作

發(fā)布時間:2023/12/10 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate教程(5)--CRUD操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

NHibernate之旅(5):探索Insert, Update, Delete操作

2008-10-17 16:31 by 李永京, 42903 閱讀, 73 評論, 收藏,? 編輯

本節(jié)內(nèi)容

  • 操作數(shù)據(jù)概述
  • 1.新建對象
  • 2.刪除對象
  • 3.更新對象
  • 4.保存更新對象
  • 結(jié)語

操作數(shù)據(jù)概述

我們常常所說的一個工作單元,通常是執(zhí)行1個或多個操作,對這些操作要么提交要么放棄/回滾。想想使用LINQ? to SQL,一切的東西都在內(nèi)存中操作,只有調(diào)用了DataContext.SubmitChanges()方法才把這些改變的數(shù)據(jù)提交到數(shù)據(jù)庫中,LINQ to? SQL那么提交要么回滾。

我們使用NHibernate也一樣,如果只查詢數(shù)據(jù),不改變它的值,就不需要提交(或者回滾)到數(shù)據(jù)庫。

注意:這節(jié),我們在上一節(jié)源代碼的基礎(chǔ)上,在數(shù)據(jù)訪問層中新建CRUD.cs類用于編寫操作方法,在數(shù)據(jù)訪問的測試層新建一CRUDFixture.cs類用于測試。

1.新建對象

簡單描述:新建一個對象;調(diào)用ISession.Save();同步ISession。

例子:在數(shù)據(jù)訪問層編寫CreateCustomer()方法,把傳過來的Customer對象保存在數(shù)據(jù)庫中。

public int CreateCustomer(Customer customer) {int newid = (int)_session.Save(customer);_session.Flush();return newid; }

我們測試這個方法,新建一個Customer對象,調(diào)用CreateCustomer()方法返回新插入的CustomerId,再次根據(jù)CustomerId查詢數(shù)據(jù)庫是否存在這個對象。

[Test] public void CreateCustomerTest() {var customer = new Customer() { Firstname = "YJing", Lastname = "Lee" }; int newIdentity = _crud.CreateCustomer(customer); var testCustomer = _crud.GetCustomerById(newIdentity); Assert.IsNotNull(testCustomer); }

2.刪除對象

簡單描述:獲取一個對象;調(diào)用ISession.Delete();同步ISession。

說明:使用ISession.Delete()會把對象的狀態(tài)從數(shù)據(jù)庫中移除。當(dāng)然,你的應(yīng)用程序可能仍然持有一個指向它的引用。所以,最好這樣理解:Delete()的用途是把一個持久化實例變成臨時實例。? 你也可以通過傳遞給Delete()一個NHibernate 查詢字符串來一次性刪除很多對象。刪除對象順序沒有要求,不會引發(fā)外鍵約束沖突。當(dāng)然,有可能引發(fā)在外鍵字段定義的NOT NULL約束沖突。

例子:在數(shù)據(jù)訪問層編寫DeleteCustomer()方法,從數(shù)據(jù)庫中刪除Customer對象。

public void DeleteCustomer(Customer customer) {_session.Delete(customer);_session.Flush(); }

我們測試這個方法,在數(shù)據(jù)庫中查詢CustomerId為2的Customer對象,調(diào)用DeleteCustomer()方法刪除,再次根據(jù)CustomerId查詢數(shù)據(jù)庫是否存在這個對象。

[Test] public void DeleteCustomerTest() {var coutomer = _crud.GetCustomerById(2);_crud.DeleteCustomer(coutomer);var testCustomer = _crud.GetCustomerById(2);Assert.IsNull(testCustomer); }

3.更新對象

簡單描述:獲取一個對象;改變它的一些屬性;調(diào)用ISession.Update();同步ISession。

例子:在數(shù)據(jù)訪問層編寫UpdateCustomer()方法,修改Customer對象。

public void UpdateCustomer(Customer customer) {_session.Update(customer);_session.Flush(); }

測試這個方法,在數(shù)據(jù)庫中查詢CustomerId為1的Customer對象并修改它的Firstname屬性值,調(diào)用UpdateCustomer()方法更新,再次查詢數(shù)據(jù)庫中CustomerId為1的Customer對象的Firstname值為修改之后的值。

[Test] public void UpdateCustomerTest() {var customer = _crud.GetCustomerById(1);customer.Firstname = "liyongjing";_crud.UpdateCustomer(customer);var testCustomer = _crud.GetCustomerById(1);Assert.AreEqual("liyongjing", customer.Firstname); }

4.保存更新對象

你會不會想出這個問題?哪些是剛剛創(chuàng)建的對象,哪些是修改過的對象?對于剛剛創(chuàng)建的對象我們需要保存到數(shù)據(jù)庫中,對于修改過的對象我們需要更新到數(shù)據(jù)庫中。

幸好,ISession可以識別出這不同的對象,并為我們提供了ISession.SaveOrUpdate(object)方法

ISession.SaveOrUpdate(object)方法完成如下工作:

  • 檢查這個對象是否已經(jīng)存在Session中。
  • 如果對象不在,調(diào)用Save(object)來保存。
  • 如果對象存在,檢查這個對象是否改變了。
  • 如果對象改變,調(diào)用Update(object)來更新。

看看下面例子說明了這種情況,在數(shù)據(jù)訪問層編寫SaveOrUpdateCustomer()方法,保存更新Customer對象列表,依次遍歷列表中的Customer對象,調(diào)用ISession.SaveOrUpdate(object)方法保存更新每個Customer對象。

public void SaveOrUpdateCustomer(IList<Customer> customer) {foreach (var c in customer) { _session.SaveOrUpdate(c); } _session.Flush(); }

測試這個方法,先在數(shù)據(jù)庫中查詢Firstname為YJing的Customer對象并修改它的Lastname屬性值,這些對象是數(shù)據(jù)庫中存在的,并改變了,然后新建2個Customer對象,這兩個對象在數(shù)據(jù)庫中不存在,是新創(chuàng)建的。調(diào)用SaveOrUpdateCustomer()方法保存更新對象,即更新前面修改的對象和保存了后面新創(chuàng)建的2個對象。再次查詢數(shù)據(jù)庫中Firstname為YJing,Lastname為YongJing的Customer對象是否一致了。

[Test] public void SaveOrUpdateCustomerTest() {IList<Customer> customers = _crud.GetCustomersByFirstname("YJing");foreach (var c in customers) { c.Lastname = "YongJing"; } var c1 = new Customer() { Firstname = "YJing", Lastname = "YongJing"}; var c2 = new Customer() { Firstname = "YJing", Lastname = "YongJing"}; customers.Add(c1); customers.Add(c2); int initiaIListCount = customers.Count; _crud.SaveOrUpdateCustomer(customers); int testListCount = _crud.GetCustomersByFirstnameAndLastname("YJing", "YongJing").Count; Assert.AreEqual(initiaIListCount, testListCount); }

結(jié)語

當(dāng)然,這一節(jié)操縱對象操作,在NHibernate中涉及了對象的狀態(tài), 對象對一個特定的ISession來說,有三種狀態(tài)分別是:瞬時(transient)對象、持久化(persistent)對象、游離(detached)對象。這一節(jié)沒有說到了,以后在討論Session的時候再介紹。

轉(zhuǎn)載于:https://www.cnblogs.com/zhengwei-cq/p/7359665.html

總結(jié)

以上是生活随笔為你收集整理的NHibernate教程(5)--CRUD操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。