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

來源:互聯網
上載者:User

標籤:io   使用   ar   strong   for   資料   問題   on   代碼   

本節內容

  • 操作資料概述
  • 1.建立對象
  • 2.刪除對象
  • 3.更新對象
  • 4.儲存更新對象
  • 結語
操作資料概述

我們常常所說的一個工作單元,通常是執行1個或多個操作,對這些操作要麼提交要麼放棄/復原。想想使用LINQ to SQL,一切的東西都在記憶體中操作,只有調用了DataContext.SubmitChanges()方法才把這些改變的資料提交到資料庫中,LINQ to SQL那麼提交要麼復原。

我們使用NHibernate也一樣,如果只查詢資料,不改變它的值,就不需要提交(或者復原)到資料庫。

注意:這節,我們在上一節原始碼的基礎上,在資料訪問層中建立CRUD.cs類用於編寫操作方法,在資料訪問的測試層建立一CRUDFixture.cs類用於測試。

1.建立對象

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

例子:在資料訪問層編寫CreateCustomer()方法,把傳過來的Customer對象儲存在資料庫中。

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

我們測試這個方法,建立一個Customer對象,調用CreateCustomer()方法返回新插入的CustomerId,再次根據CustomerId查詢資料庫是否存在這個對象。

[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.刪除對象

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

說明:使用ISession.Delete()會把對象的狀態從資料庫中移除。當然,你的應用程式可能仍然持有一個指向它的引用。所以,最好這樣理解:Delete()的用途是把一個持久化執行個體變成臨時執行個體。 你也可以通過傳遞給Delete()一個NHibernate 查詢字串來一次性刪除很多個物件。刪除對象順序沒有要求,不會引發外鍵約束衝突。當然,有可能引發在外鍵欄位定義的NOT NULL約束衝突。

例子:在資料訪問層編寫DeleteCustomer()方法,從資料庫中刪除Customer對象。

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

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

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

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

例子:在資料訪問層編寫UpdateCustomer()方法,修改Customer對象。

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

測試這個方法,在資料庫中查詢CustomerId為1的Customer對象並修改它的Firstname屬性值,調用UpdateCustomer()方法更新,重新查詢資料庫中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.儲存更新對象

你會不會想出這個問題?哪些是剛剛建立的對象,哪些是修改過的對象?對於剛剛建立的對象我們需要儲存到資料庫中,對於修改過的對象我們需要更新到資料庫中。

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

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

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

看看下面例子說明了這種情況,在資料訪問層編寫SaveOrUpdateCustomer()方法,儲存更新Customer對象列表,依次遍曆列表中的Customer對象,調用ISession.SaveOrUpdate(object)方法儲存更新每個Customer對象。

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

測試這個方法,先在資料庫中查詢Firstname為YJing的Customer對象並修改它的Lastname屬性值,這些對象是資料庫中存在的,並改變了,然後建立2個Customer對象,這兩個對象在資料庫中不存在,是新建立的。調用SaveOrUpdateCustomer()方法儲存更新對象,即更新前面修改的對象和儲存了後面新建立的2個對象。重新查詢資料庫中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);}
結語

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.