標籤:主鍵 sans cep code enc base isp 讀取 ges
程式架構
如今比較經典的架構,看看以片。
怎樣實現
在一個N層應用程式中我們怎樣使用LINQ to SQL呢?這給剛剛入門的朋友的確是個難題,使用LINQ to SQL就是ORM技術,能夠非常輕鬆的實現對資料庫記錄增刪查改操作,可是我們怎樣去“構建它”才更合理,更科學,更好用?這才是我們真正要學習的。使用物件導向的介面、抽象達到這個目的,面向介面編程就是更好的選擇。能夠更好的維護和測試。
以下一步一步完畢這個程式吧,看到標題了嗎?這篇是打破舊觀念。看看接下來有什麼神奇的地方。
首先建立一個project,有兩個類庫分別為:資料訪問層DataAccess和單元測試UnitTest,看看:
資料訪問層
這篇先建立一個資料訪問對象,因為使用LINQ to SQL作為ORM,我們建立一個LINQ to SQL類DataAccessEntities.dbml作為資料訪問對象DataContext。一切可視化的操作,為了展示,在O/R設計器中建立一個Customer類(資料訪問對象)。加入CustomerId、FirstName、LastName三個成員屬性。並在成員屬性的屬性表單改動對應的屬性。
為了展示,這裡簡單描寫敘述下我的操作,設定成員屬性例如以下:
- CustomerId:成員屬性的類型Int。屬性的名稱CustomerId,資料庫列的名稱CustomerId。資料庫列參與表的主鍵True。插入時在資料庫中自己主動產生值True,指定插入時自己主動同步屬性。
- FirstName:屬性的名稱FirstName,資料庫列的名稱FirstName,其他預設
- LastName:屬性的名稱LastName,資料庫列的名稱LastName,其他預設
好了,簡單的資料訪問對象建立好了,以下測試了~~
單元測試層
單元測試用於測試用例的成功與失敗,在軟體開發中起著尤為重要的地位。當然使用單元測試的要求非常嚴格。這個系列我將嚴格遵守,我整理的要求例如以下
1.盡量在斷言中提供錯誤資訊描寫敘述,這能夠非常easy的發現你的錯誤。
2.每一個測試全然獨立。體現物件導向中的單一職責原則。
3.不要假設資料庫中有什麼資料或者哪些資料不在資料庫中,在每一個測試方法前保證資料庫為空白的。
4.測試時須要的一些未經處理資料要作為測試的一部分在測試方法前載入到資料庫中。
遵守上面的要求,就可能面臨以下的麻煩:
- 在測試前刪除每張表的每行資料,PK關聯須要另外寫刪除SQL語句指令碼。
- 商務邏輯層建立了你沒有預料到的資料,你不優點理。
- 假設你測試失敗,在資料庫中查看資料不在資料庫中,沒有不論什麼提示資訊你不知道系統做了什麼。
- 因為記錄被鎖定,插入資料不寫入資料庫。也不能在不同資料庫連接中讀取。
幸好LINQ to SQL做到了上面的一切,LINQ to SQL的DataContext能夠用來管理資料架構,它提供了DatabaseExists()、DeleteDatabase()、CreateDatabase()方法能夠非常輕鬆的建立刪除資料庫。
注意。這個系列我使用NUnit.Framework測試,所以要引用nunit.framework.dll程式集。另外因為代碼編寫中涉及了這個類庫引用System.configuration.dll、System.Data.Linq.dll程式集和Business項目。
1.建立一個測試基類
測試一般是非常複雜的,我們建立一個測試基類用於編寫一些通用的方法,然後全部測試類都繼承這個測試基類,這個基類主要完畢以下功能。
第一步:手動設定DataContext串連和日誌
在我們的資料訪問層只建立了一個資料訪問對象,沒有和資料庫打交道,測試時須要對DataContext串連到資料庫。
另外為了測試顯示具體的資訊,我們還要使用DataContext的日誌功能。
public string ConnectionString { get { if (ConfigurationManager.ConnectionStrings["conn"] == null || String.IsNullOrEmpty(ConfigurationManager.ConnectionStrings["conn"].ConnectionString) == true) { throw new InvalidOperationException("預設的連接字串不存在或者為空白"); } return ConfigurationManager.ConnectionStrings["conn"].ConnectionString; } } private DataAccessEntitiesDataContext m_dataContext; public DataAccessEntitiesDataContext DataContext { get { if (m_dataContext == null) { m_dataContext = new DataAccessEntitiesDataContext(ConnectionString); m_dataContext.Log = Console.Out; } return m_dataContext; } }
第二步:建立資料庫
在測試之前。開啟暫時串連用於建立資料庫。使用DataContext提供了DatabaseExists()、DeleteDatabase()、CreateDatabase()方法,先使用DatabaseExists()驗證資料庫是否存在,假設存在使用DeleteDatabase()方法刪除。使用CreateDatabase()方法建立一個資料庫結構描述,及時釋放這個串連。
[TestFixtureSetUp]public void Init(){ DataAccessEntitiesDataContext context = new DataAccessEntitiesDataContext(ConnectionString); context.Log = Console.Out; if (context.DatabaseExists() == true) { context.DeleteDatabase(); } context.CreateDatabase(); context.Connection.Close(); context.Dispose(); context = null;}
第三步:關閉全部串連
在測試結束關閉全部的串連,這一步非常必要哦。
[TestFixtureTearDown]public void Tear(){ DataContext.Connection.Close();}
第四步:設定連接字串
建立一App.config檔案。設定連接字串:
<?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="conn" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=LINQ;Integrated Security=True"/> </connectionStrings></configuration>
2.測試類
我們建立一個測試類用於測試資料訪問對象。這裡簡單測試建立一個Customer對象。建立CustomerFixture.cs類繼承UnitTestBase
編寫建立Customer對象方法例如以下,建立一個Customer對象,調用InsertOnSubmit()方法插入,調用DataContext.SubmitChanges()方法提交資料庫。
[Test]public void CreateCustomerTest(){ Customer customer = new Customer() { FirstName = "YJing", LastName = "Lee" }; Assert.AreEqual(0, customer.CustomerId, "測試前CustomerId為0"); DataContext.Customer.InsertOnSubmit(customer); DataContext.SubmitChanges(); Assert.AreNotEqual(0, customer.CustomerId, "調用SubmitChanges()方法後CustomerId不為0");}
測試成功,看看輸出結果:
OH!非常酷!首先建立了資料庫結構描述,然後插入了一條資料。再次測試一下這種方法將是什麼結果呢?這個問題就留給大家了。
結語
看到了嗎?這就是全新的方式來完畢非常酷的工作!
從物件導向入手。利用LINQ to SQL產生其關係型資料庫。一切就是這麼easy!這篇只在資料訪問層上建立一資料訪問對象,在測試中調用DataContext提供的方法完畢資料操作!
下篇更精彩!
LINQ to SQL活學活用(1):這要打破舊觀念