程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> NHibernate之旅(5):探索Insert,Update,Delete操作

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

編輯:關於.NET

本節內容

操作數據概述

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的時候再介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved