設計 LINQ to SQL Class 的注意事項 分享 📅 2008/03/22 00:01 📁 .NET Framework, ASP.NET, LINQ 我們已經使用 ASP.NET 3.5 在三個案子了,全部都採用 LINQ to SQL Class 當作資料存取的介面,當中的確有些需要特別注意的地方,在此做個整理: 在 Visual Studio 2008 中可以關閉 Pluralization of names 設定在 VS2008 的 Tools -> Options 選項設定的 Database Tools -> O/R Designer 中的 Pluralization of names 預設 Enabled 是設定為 True,建議設定成 False這個設定如果設為 True 的話,在 *.dbml 中的「資料集合類別」的名稱會被多加上個討厭的 s ( 複數的意思 ),我舉三個透過 LINQ to SQL Class Designer 產生的名稱做說明:1. 表格名稱:Banner 單一物件名稱叫做 Banner 集合物件名稱叫做 Banners2. 表格名稱:RegionClass 單一物件名稱叫做 RegionClass 集合物件名稱叫做 RegionClasses3. 表格名稱: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]在設計 LINQ to SQL Class 的時候,有預設資料的欄位要特別設定 Auto Generated Value 為 True,否則會新增失敗在 Table 之間的關聯性(Association),可以設定要產生出關聯物件的 Child Property Name 與 Parent Property Name,變更過後的名字在使用上會比較好辨識,但是一定 Child Property 與 Parent Property 兩個都設定才行。基本上,資料庫中有設定關聯的在 LINQ to SQL Class 中預設就會自己設定好了,不用特別設定。但自行定義關聯的部分就需要特別手動設定了!至於什麼時候會需要「自行設定」呢?就是當資料庫更新後,你不想重拉表格時,就有可能自行建立關聯(Association)!如果有欄位會同時出現在 DataBoundControl ( 例如:GridView, DetailsView, FormView ) 的 Edit 與 ReadOnly 兩種模式下,該欄位的 Update Check 屬性要設定成 Always 或 WhenChanged,否則在 Edit 模式更新資料之後進入 ReadOnly 模式會看不到這個欄位更新的值。大部分的情況下所有欄位的 Update Check 屬性都會被設定成 Always,但不知為何有些欄位就是會被預設成 Never 而導致在開發的時候發生奇怪的問題(就是更新後資料看不到的情況)。每當從 Server Explorer 拉表格進去設計介面時,通常會在 web.config 新增一個跟原本不一樣的 ConnectionString,所以有可能在 web.config 多一組「只有 LINQ to SQL Class 使用」的 ConnectionString,所以你可以進 *.dbml 修改 SettingsPropertyName 屬性,改成跟你原本用的就好,再去 web.config 把多餘的 ConnectionString 刪除!通常編輯完 *.dbml 檔案後,只要一存檔就會自動更新 *.designer.cs 檔案,如果你發現你的 *.designer.cs 檔案只有更新「修改時間」但是沒有更新「檔案內容」的話,就是你的 *.dbml 中的定義有問題,但是你按下 Save 按鈕時並不會提示錯誤訊息,不過當你按下 Save All (儲存全部)按鈕時 VS2008 卻會提示你錯誤訊息喔,真的很奇怪!只要將 DBML 放置在 App_Code 目錄下的不同子目錄內,彼此的 LINQ to SQL Class 就會有不同的 Namespace,即便拉了相同的表格在不同的 Class 也不會發生衝突!如果資料庫很大、表格很多的話,想要依照邏輯的區分不同的 LINQ to SQL Class 可以用這個小技巧做切割,以簡化複雜度。沒事不要自己去改 *.designer.cs 檔,要擴充功能請用 partial class 擴充,如果你真的需要自行修改 *.designer.cs 檔的話,那就別再用 DBML Designer 了,以免你改過的程式被覆寫掉。