LINQ to SQL系列Part 2 - Defining our Data Model Classes

LINQ to SQL系列Part 2 - Defining our Data Model Classes
本文轉載自:
http://www.cnblogs.com/hanxianlong/archive/2007/11/17/960914.html

英文原貼鏈接:
http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx


在我的LINQ to SQL系列博客的第一部分(Part 1)我講解了“什麼是LINQ to SQL"並且提供了一些LINQ to SQL能支持的數據環境。

在我的第一篇帖子中,我提供了展示如何用LINQ to SQL來進行一些常用的數據處理,包括如下幾個方面:

如何查詢數據庫

如何更新數據庫中的行

如何在數據庫中插入並操作關聯操作數據行

如何在數據庫中刪除記錄

如何調用存儲過程

如何查詢在服務器端分頁的數據

所有的這些數據操作,我都是在如下的這個LINQ to SQL 類模型中進行的:


 

在本系列的第二篇帖子中,我將更具體地講解一下如何生成上面這個LINQ to SQL 數據模型。LINQ to SQL設計器,和我在這個博客系列中提到的所有特性都是.NET 3.5中和VS "Orcas"版本中的一部分。

你可以從Visual Studio "Orcas" Beta 1或Visual Web Developer Express "Orcas" Beta1中下載來跟着如下的操作,兩個個都可以和VS2005一起安裝。


新建一個新的ILNQ to SQL數據模型

你可以向ASP.NET,類庫或Windows客戶端的項目中按照如下方式添加LINQ to SQL數據模型:點擊"Add New Item"選項,在彈出的對話框中選擇“LINQ to SQL"項:


 

選擇"LINQ to SQL"項將會彈出"LINQ to SQL"設計器,然後允許你製作一個代表了關係型數據庫的模型類。它還會生成一個強類型的"DataContext"類,該類會有代表了我們從數據庫以代表了我們數據庫的每一張數據表的屬性,代表了我們數據庫中的存儲過程的方法。如我在該系列的Part 1 中描述的那樣,DataContext類是我們從數據庫中查詢以及將更新存回至數據庫中的一個主要管道。

下面是一個空LINQ to SQL 的ORM設計器的屏幕截圖,也是在生成了一個新的LINQ to SQL數據模型之後你首先會看到的:


 


實體類

LINQ to SQL 使你製作一個映射了或映射到數據庫的類。這些類被有稱爲“實體類”並且它們的實例被“實體”。實體類映射了數據庫中的數據表。實體的屬性映射到表的列。每個實體代表了數據表中的一行記錄。

用LINQ to SQL定義的實體類不用必須繼承自某一個特定的基類,這說你可以讓它繼承自任何一種對象。所有用LINQ to SQL設計器生成的類都被定義爲了"局部類“,這意味着你可以選擇向局部類中添加代碼和添加附加的屬性,方法和事件。

和VS2005中提供了DataSet/TableAdapter不同,當用LINQ to SQL設計器時,你不必在生成數據模型和訪問層時指明SQL查詢語句。

相反,你只需要將注意力集中到你的實體類,以及它們如何映射到/從 數據庫,和它們之間的關係上。LINQ to SQL OR/M將會注意如何在你和和該類交互並使用數據實體時生成合適的SQL執行語句邏輯。你可以用強類型的方法來通過LINQ 查詢語法來表達如何從數據模型中查詢。


從數據庫中生成實體類

如果你已經有了一個已定義好的數據庫模型,你可以用它很快地來生成一個脫離於它的LINQ to SQL實體類。實現這個的最簡單的方法就是在Vs的Server Explorer窗口中打開一個數據庫,選擇你想生成模型的數據表和視圖,然後將它們通過拖放的方式放到LINQ to SQL設計器上:



當從"Northwind"數據庫中向LINQ to 設計器面板上添加兩個如上的如時,你會看到如下的基於你的數據結構的三個實體類:
 

 通過上邊定義的的數據模型,我現在就可以執行在本系列的第一部分(Part 1)中提及的所有事例代碼(除了存儲過程那個)。我不用添加任何的其他附加代碼或者設置,直接就可以運行那些查詢,插入,更新,刪除和服務器端分頁的代碼。


命名及複數

有一件事你可能已經注意到了,當用LINQ to SQL設計器生成基於你的數據庫結構的實體類時,它會自動地將表和列名變爲“複數”。例如:在事例中的“Products"產生了一個"Product"類,"Categories"表產生了一個"Category"類。這些類命名方法使你的模型和.NET 的命名相一致,並且我經常發現讓設計器爲我完成命名非常地方便(尤其當向模型中添加許多的表時)。


如果你不喜歡設計器生成的類的名稱或屬性名稱,你也可以重寫它將它重命名爲你想要的名字。你可以通過如下方式進行重命名:或者在設計器中的已聲明的名字內部來修改或者通過屬性列來修改:

 

這種將你數據庫中結構中的實體/屬性/關係的方法命名爲不同的名的方法在許多情況下非常有用,特別是:

1)當原來的數據庫中的表/列名變化時。因爲你的實體模型根據後端的不同的名字,你可以用新的表/列名稱,只更新你映射的規則而不更新你的應用程序或者查詢代碼。

2)當你的數據庫模型的名字不是十分“清晰”時。例如,在開發時,你可以將名字命名爲"LastName"和"FirstName",而不用爲一個實體類的屬性命名爲“au_lnname"和"au_fname"(不用重命名數據庫中的列名)。


關係組織

當你從Server Explorer中拖對象到LINQ to SQL設計器中時,VS將會檢測對象的主/外鍵,並且通過它們在它生成的不同的實體類中生成“關係組織”。例如,當我從Northwind數據庫中添加Product和Categories兩個表到LINQ to SQL設計器時,你將看到在二者之後將生成一對多的關係(在設計器中通過箭頭來表示)

  
 上面的關係將會使得Product實體類有一個"Category"屬性,開發者可以通過此屬性來獲取到屬性此類別的所有產品集合。

 

如果你不喜歡設計器爲你生成或者命名一個關係,你也可以重寫它。只要單擊設計器中的關係箭頭,通過屬性器找到它的屬性來重命名,刪除或修改它。

延遲/惰加載

LINQ to SQL可以讓開發者指定在初次調用時就加載還是延遲/惰加載。你可通過在設計器中選擇一個實體屬性或方法,指定是預先加載還是延遲加載,然後在屬性窗口中將“Delay Loaded"屬性設置爲true或false。

舉個簡單的例子,當我想做這些的時,來看一下我們剛纔生成的"Category"實體類,Northwind中的categories表有一個"Picture"字段,該字段存儲了一個每一個類別的圖片(非常大),並且我只想在我用它的時候再從數據庫中檢索該二進制的圖片字段(不是我在做一個列出所有列表的簡單查詢時就檢索出來)

我可以通過在LINQ to SQL設計器中選擇Picture屬性,將它的Delay Loaded的值設置爲true。
 

 

注意:除了在實體上設置默認的pre-fetch/delay加載之外,你也可以在對實體類寫LINQ 查詢時通過代碼控制它。

使用存儲過程

LINQ to SQL允許你選擇地將存儲過程作爲你的DataContext類的一個方法。例如,假如我們已經定義了一個如下的存儲過程,該存儲過程通過categoryID來產品的信息:
 
 爲了添加一個強類型的方法來執行存儲過程,我可以用在Vs中的server explorer來拖/放存儲過程到LINQ to SQL設計器上。如果我將存儲過程放到設計器中的"Product"上,LINQ to SQL設計器將會聲明一個返回IEnumberable<Product>結果集的方法。


 然後我可以或者使用LINQ的查詢語法(它會生成adhoc SQL 查詢)或者利用執行以上添加的存儲過程方法來從數據庫中產品實體:
 
 

使用存儲過程來更新/刪除/插入數據

默認情況下,在你插入/更新/刪除實體時,LINQ to SQL將會自動的爲你生成合適的SQL語句。例如,當你寫了如下的更新"Product"實體對象的一些值的LINQ to SQL代碼時:

 默認情況下,當你提交更新時,LINQ to SQL將會生成並執行合適的"Update"語句聲明。(我將會有下幾篇帖子中來講解“更新”這一部分)。你也選擇定義自己的Insert,Update,Delete的存儲過程。設置自定義的存儲過程的話,在LINQ to SQL設計器的實體類上單擊,在屬性窗口中點擊Delete/Insert/Update之後的“...”按鈕,選擇你已經定義好的存儲過程來替換默認的:
 

更改以上設置的好處是,這在LINQ to SQL的映射層很完全地做完了,這意味着我前其展示的更新的代碼將會在不更改的情況下繼續正常使用。這避免了開發者在使用LINQ to SQL模型時,更改代碼來優化程序,即便要添加一個自定義的存儲過程。

總結

LINQ to SQL提供了一種優秀的,清晰的方法來爲你的應用程序製作數據層。一旦你定義了數據模型,你可以對它進行有效的查詢,插入,更新和刪除。

通過VS和Visual Web Developer Express內置的LINQ to SQL設計器,你可以快速地生成數據模型,尤其生成LINQ to SQL模型。LINQ to SQL設計器還提供了許多你能自定義的默認行爲進行靈活擴展來滿足你的特殊的需求。

在接下來的帖子中,我將會用上邊生成的數據模型來進一步的進行演練查詢,插入,更新和刪除。在更新,插入和刪除帖子中我將再次討論如何向我們設計的實體中添加自定義的業務/數據驗證邏輯。

Mike Taulty 還有許多好的Linq to SQL 視頻,我已經在這裏進行了推薦。這將爲一個初學者提供一個非常方便的道路。

Scott
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章