The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

設計 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 設定

    這個設定如果設為 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 就好了,而導致錯誤發生!

    [code:html]
           <asp:LinqDataSource ID="ldsRegionClass" runat="server"
               ContextTypeName="MyDataContext"
               TableName="RegionClass" OrderBy="Name">
           </asp:LinqDataSource>
    [/code]

  2. 在設計 LINQ to SQL Class 的時候,有預設資料的欄位要特別設定 Auto Generated Value 為 True,否則會新增失敗

    在設計 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 兩個都設定才行。

  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 模式會看不到這個欄位的值。

  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 了,以免你改過的程式被覆寫掉。