根據LINQ to SQL (Part 2 - Defining our Data Model Classes)翻譯整理。載到了Visual C# “Orcas” Express Edition,因為該版本不支援SQL Server 2005 Developer Edition的連結,所以結合SQL Server Express Edition的AdventureWorks資料庫,來分享一下LINQ設計器的使用。
一、建立用於SQL的LINQ資料模型
用於SQL的LINQ資料模型可以通過開啟Visual Studio中的"Add New Item" 選項,並選中“LINQ to SQL”項來添加到ASP.NET,類庫或Windows應用程式項目中。
當添加“LINQ to SQL”檔案到項目中時,Visual Studio就會轉到LINQ設計器介面,現在就可以進行建模操作了。同時,設計器會建立一個強型別的“DataContext”類,該類中的屬性代表了從資料庫中建模到LINQ中的每一個表,而方法則代表了我們選擇建模的每一個預存程序,DataContext類是從資料庫中查詢實體集合和應用變化返回資料庫的主要渠道。
如所示,這就是LINQ的ORM設計介面:
實體類:
用於SQL的LINQ可以建模映射資料庫的類。這些類通常被稱為“Entity Classes(實體類)”,它們的執行個體被稱為“Entities(實體)”。實體類映射了資料庫中的表,類中的屬性通常映射了表中的欄位,實體類的每一個執行個體則代表了資料庫中表的一條記錄。通過LINQ定義的實體類不繼承於任何基類,這就意味著你可以讓它繼承於任意對象。而且使用LINQ設計器建立的類都被定義為“Partial Classes(局部類)”,所以就可以選擇性的給類添加代碼,附加屬性、方法和事件。
與Visual Studio 2005提供的DataSet/TableAdapter功能不同的是,當使用LINQ設計器建立資料模型和訪問層時不需要指定SQL查詢語句。相應地,我們應該專註於實體類的定義,以及如何映射資料庫和它們之間的關係。用於SQL的LINQ OR/M實現關心的是在運行時使用資料實體的時候,產生適當的SQL執行邏輯。使用LINQ查詢文法通過強型別的方式來表達如何查詢資料模型。
二、從資料庫中建立實體類
如果有現有的資料庫結構描述定義,可以通過它快速的建立LINQ中的實體類。當然,最簡單的方式就是開啟Visual Studio中的伺服器瀏覽器(Express Edition中為Database Explorer——資料庫瀏覽器),選中想要建模的表或視圖,然後拖放到LINQ設計器介面中,就會自動產生對應的實體類:
三、命名與去複數化
需要注意的是,當使用LINQ設計器基於資料庫結構描述建立實體類的時候,會自動“pluralizes(去複數形式)”。如果表名是“Employees”,類名就會是“Employee”,這種類命名方式會確保建模符合.NET命名規範。當然,也可以通過設計器或屬性欄來對類和屬性重新命名:
實體/屬性/關聯擁有與資料庫構架不同的命名的功能在一些情況下會十分有用,尤其是:
1.當後端資料庫表/欄位命名變化的時候。因為實體模型可以擁有不同的命名,所以僅僅更新映射規則就可以了,而不需要更新應用程式或用於新表/欄位的查詢代碼。
2.當使用的資料庫結構描述不是十分“整潔”的時候。例如,對於一個實體類中“au_lname”和“au_fname”的屬性來說,可以重新命名為“LastName”和“FirstName”來使用,而不必在資料庫中重新命名。
四、關係關聯
當從伺服器瀏覽器拖拽對象到LINQ設計器時,Visual Studio會自動檢測對象間的主/外鍵關係,並根據它們建立不同實體間的預設“relationship associations(關係關聯)”。例如,當把EmployeeAddress和Address都添加到LINQ設計器時,就會用箭頭自動表示出一個一對多關聯:
上面的關聯會使EmployeeAddress實體類中擁有一個Address屬性,這樣就可以通過給定的EmployeeAddress來訪問Address實體。同樣的,Address實體類中會擁有一個“EmployeeAddress”集合來擷取所有在該Address的EmployeeAddress記錄。當然,也可以屬性欄來修改設計器中選中關聯的屬性:
五、延遲/惰性讀取
LINQ可以讓開發人員指定實體中的屬性在第一次訪問的時候是預讀取還是延遲/惰性讀取。通過選中實體的任一屬性或關聯,在屬性欄中設定“Delay Loaded”屬性為true或false。例如,現在有Document這樣一個實體類,它所映射的資料庫中的Document表中的Document欄位儲存了關於產品描述的文檔資料,我們只想在實際使用它的時候再讀取它。那麼,就可以設定它的Deloy Loaded屬性為true來延遲讀取它:
注意:除了配置實體屬性的預讀取/延遲讀取的預設值外,也可以在執行LINQ查詢時,在代碼中覆寫它們的值。
六、使用預存程序
用於SQL的LINQ允許把預存程序以方法的形式建模到DataContext類中。例如,我們定義一個這樣的預存程序——基於EmployeeID來查詢Employee的Address資訊:
我們可以在Visual Studio中通過把該預存程序拖拽到LINQ設計器,添加一個強型別方法來調用這個預存程序。如果拖動預存程序到LINQ設計器的“Address”實體上,如果該預存程序返回的表值結構與實體類中的屬性匹配,設計器就會聲明該預存程序會返回一個IEnumerable<Address>結果集:
七、使用預存程序更新/刪除/插入資料
預設情況下,當更新/刪除/插入實體時LINQ會自動產生適當的SQL運算式。當然也可以使用自訂的更新/刪除/插入預存程序,在LINQ設計器中選中實體類,在屬性欄中的Delete/Insert/Update上點擊“...”,選擇要使用的預存程序:
注意,改變以上的設定都只是純粹的在LINQ映射層進行的處理,那麼早先在程式中的代碼就可以在不做任何改動的情況下繼續工作。