﻿# 設計 LINQ to SQL Class 的注意事項

我們已經使用 ASP.NET 3.5 在三個案子了，全部都採用 LINQ to SQL Class 當作資料存取的介面，當中的確有些需要特別注意的地方，在此做個整理：

1.  **在 Visual Studio 2008 中可以關閉 Pluralization of names 設定  
      
    **在 VS2008 的 Tools -> Options 選項設定的 Database Tools -> O/R Designer 中的 Pluralization of names 預設 Enabled 是設定為 True，建議設定成 False  
      
    ![在 Visual Studio 2008 中可以關閉 Pluralization of names 設定](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0a82ebf993a5442a4319-Screenshot-080321-195324.png "在 Visual Studio 2008 中可以關閉 Pluralization of names 設定")  
      
    這個設定如果設為 True 的話，在 \*.dbml 中的「資料集合類別」的名稱會被多加上個討厭的 s ( 複數的意思 )，我舉三個透過 LINQ to SQL Class Designer 產生的名稱做說明：  
      
    1\. 表格名稱：Banner  
      
        單一物件名稱叫做 Banner  
        集合物件名稱叫做 Banners  
      
    2\. 表格名稱：RegionClass  
      
        單一物件名稱叫做 RegionClass  
        集合物件名稱叫做 RegionClasses  
      
    3\. 表格名稱：ProductSeries  
      
        單一物件名稱叫做 ProductSery  
        集合物件名稱叫做 ProductSeries  
      
    看出差異了嗎？表格多的時候你真的會瘋掉。如果要啟用這個選項，你就要保佑你的表格名稱取的夠好，讓 LINQ to SQL Class Designer 不要隨便幫你亂取名字，不然你怎麼猜也猜不到。  
      
    以使用 LinqDataSource 為例，如果 Pluralization of names 設為 True 的話，這裡的 TableName 必須要用 RegionClasses，而不是 RegionClass，但第一次用的人都會以為打 RegionClass 就好了，而導致錯誤發生！
    
    ```html
    <asp:LinqDataSource ID="ldsRegionClass" runat="server"
        ContextTypeName="MyDataContext"
        TableName="RegionClass" OrderBy="Name">
    </asp:LinqDataSource>
    ```
    
2.  **在設計 LINQ to SQL Class 的時候，有預設資料的欄位要特別設定 Auto Generated Value 為 True，否則會新增失敗**  
      
    ![在設計 LINQ to SQL Class 的時候，有預設資料的欄位要特別設定 Auto Generated Value 為 True，否則會新增失敗](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6090b75e1e5e5f53261c-Screenshot-080321-200311.png "在設計 LINQ to SQL Class 的時候，有預設資料的欄位要特別設定 Auto Generated Value 為 True，否則會新增失敗")  
      
    
3.  **在 Table 之間的關聯性(Association)，可以設定要產生出關聯物件的 Child Property Name 與 Parent Property Name，變更過後的名字在使用上會比較好辨識，但是一定 Child Property 與 Parent Property 兩個都設定才行。  
    **  
    基本上，資料庫中有設定關聯的在 LINQ to SQL Class 中預設就會自己設定好了，不用特別設定。但自行定義關聯的部分就需要特別手動設定了！  
      
    至於什麼時候會需要「自行設定」呢？就是當資料庫更新後，你不想重拉表格時，就有可能自行建立關聯(Association)！  
      
    ![在 Table 之間的關聯性(Association)，可以設定要產生出關聯物件的 Child Property Name 與 Parent Property Name，變更過後的名字在使用上會比較好辨識，但是一定 Child Property 與 Parent Property 兩個都設定才行。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7bbd2c96da57532cbd0b-Screenshot-080321-203744.png "在 Table 之間的關聯性(Association)，可以設定要產生出關聯物件的 Child Property Name 與 Parent Property Name，變更過後的名字在使用上會比較好辨識，但是一定 Child Property 與 Parent Property 兩個都設定才行。")  
      
    
4.  **如果有欄位會同時出現在 DataBoundControl ( 例如：GridView, DetailsView, FormView ) 的 Edit 與 ReadOnly 兩種模式下，該欄位的 Update Check 屬性要設定成 Always 或 WhenChanged，否則在 Edit 模式更新資料之後進入 ReadOnly 模式會看不到這個欄位更新的值。  
    **  
    大部分的情況下所有欄位的 Update Check 屬性都會被設定成 Always，但不知為何有些欄位就是會被預設成 Never 而導致在開發的時候發生奇怪的問題（就是更新後資料看不到的情況）。  
      
    ![如果有欄位會同時出現在 DataBoundControl ( 例如：GridView, DetailsView, FormView ) 的 Edit 與 ReadOnly 兩種模式下，該欄位的 Update Check 屬性要設定成 Always，否則 Edit 模式 Update 資料之後在 ReadOnly 模式會看不到這個欄位的值。](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/39ca03743638bc6d2093-Screenshot-080321-204255.png "如果有欄位會同時出現在 DataBoundControl ( 例如：GridView, DetailsView, FormView ) 的 Edit 與 ReadOnly 兩種模式下，該欄位的 Update Check 屬性要設定成 Always，否則 Edit 模式 Update 資料之後在 ReadOnly 模式會看不到這個欄位的值。")  
      
    
5.  **每當從 Server Explorer 拉表格進去設計介面時，通常會在 web.config 新增一個跟原本不一樣的 ConnectionString，所以有可能在 web.config 多一組「只有 LINQ to SQL Class 使用」的 ConnectionString，所以你可以進 \*.dbml 修改 SettingsPropertyName 屬性，改成跟你原本用的就好，再去 web.config 把多餘的 ConnectionString 刪除！  
      
    **
6.  **通常編輯完 \*.dbml 檔案後，只要一存檔就會自動更新 \*.designer.cs 檔案，如果你發現你的 \*.designer.cs 檔案只有更新「修改時間」但是沒有更新「檔案內容」的話，就是你的 \*.dbml 中的定義有問題，但是你按下 Save 按鈕時並不會提示錯誤訊息，不過當你按下 Save All （儲存全部）按鈕時 VS2008 卻會提示你錯誤訊息喔，真的很奇怪！  
      
    **
7.  **只要將 DBML 放置在 App\_Code 目錄下的不同子目錄內，彼此的 LINQ to SQL Class 就會有不同的 Namespace，即便拉了相同的表格在不同的 Class 也不會發生衝突！  
    **  
    如果資料庫很大、表格很多的話，想要依照邏輯的區分不同的 LINQ to SQL Class 可以用這個小技巧做切割，以簡化複雜度。  
      
    
8.  **沒事不要自己去改 \*.designer.cs 檔，要擴充功能請用 partial class 擴充，如果你真的需要自行修改 \*.designer.cs 檔的話，那就別再用 DBML Designer 了，以免你改過的程式被覆寫掉。**
