我們通常在寫 LINQ to SQL 專案時,都會利用 Visual Studio 2008 內建的 LINQ to SQL DBML Designer 讓我們透過視覺化的介面將資料庫表格、檢視表或預儲程序從 Server Explorer 拖曳到設計視窗中,不過缺點就是當資料庫結構(DB Schema)改變了之後就需要跟著修正,我通常有以下選擇:
- 手動加上欄位並自行設定欄位屬性
- 優點:彈性較大
- 缺點:手動設定錯誤很容易會出現 Bug,例如:欄位型別設定錯誤或是否 Allow Null 設定錯誤等情況。
- 刪除變更的表格,然後重新拖曳那一個表格就好
- 優點:只需重新拖曳變更的表格就好,重建速度較快。
- 缺點:當變更的表格較多時,DBML 定義檔中的 XML 結構表格變化比較大,較無法用檔案內容差異分析工具(WinMerge)分析變化的內容。若欄位有做客製化調整的動作,需重新設定一遍,例如:將 Auto Generated Value 設定為 True。
- 所有全部刪除,然後全部重新拖曳一遍
- 優點:全部重建比較乾脆,DBML 定義檔中 XML 結構的表格出現的順序也會跟當初拉的一樣,當不確定到你有哪幾個表格變更的話,可以考慮用這招。
- 缺點:若欄位有做客製化調整的動作,需重新設定一遍。手動調整過的 Layout 也會全部消失,需要重新調整一次。
這三種方式看情況使用即可。
不過很多人可能不知道在 .NET Framework 3.5 提供的工具中還有包括一個 SqlMetal.exe 指令列工具程式,可以跟透過 LINQ to SQL DBML Designer 所自動產生的 DBML 差不多,不過格式還是不太一樣,所以可能無法交替著使用,如果你原本的專案已經用 LINQ to SQL DBML Designer 建立 *.dbml 檔的話,就不用考慮採用 SqlMetal.exe 工具了,除非你打算調整你現有的 AP 中的 Entity 物件名稱。
我從 SSW Rules to Better LINQ 擷取一段 DBML Designer 與 SqlMetal 的比較表如下:
從圖表得知,若改用 SqlMetal 工具來建立 LINQ to SQL Entities 會比用 DBML Designer 更有彈性且更自動化,缺點就是較不易客製化。而另一個重點就是 SqlMetal 可以支援 SQL Server Compact,這在 VS2008 中的 DBML Designer 就沒直接支援了,若有使用到 SQL Server Compact 的人,是可以考慮使用 SqlMetal 來產生程式碼。
不過,我跟大家講一個觀念:「若你要採用自動程式碼產生的工具,就要盡量運用自動化的威力,不要拼了命的想客製化自動產生的程式碼,客製化的程式修正應該做在 Base Class 或 Inherit Class 才是正確的用法」。
SqlMetal.exe 工具通常放在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 目錄下,你只要先開啟 Visual Studio 2008 Command Prompt,然後輸入 sqlmetal 指令就可以執行了。
D:\Program Files\Microsoft Visual Studio 9.0\VC>sqlmetal
直接輸入 sqlmetal 指令不加上任何參數就會列出完整的說明:
Microsoft (R) Database Mapping Generator 2008 version 1.00.30729
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.
SqlMetal [options] [<input file>]
Generates code and mapping for the LINQ to SQL component of the .NET framework. SqlMetal can:
- Generate source code and mapping attributes or a mapping file from a database.
- Generate an intermediate dbml file for customization from the database.
- Generate code and mapping attributes or mapping file from a dbml file.
Options:
/server:<name> Database server name.
/database:<name> Database catalog on server.
/user:<name> Login user ID (default: use Windows Authentication).
/password:<password> Login password (default: use Windows Authentication).
/conn:<connection string> Database connection string. Cannot be used with /server, /database, /user or /password options.
/timeout:<seconds> Timeout value to use when SqlMetal accesses the database (default: 0 which means infinite).
/views Extract database views.
/functions Extract database functions.
/sprocs Extract stored procedures.
/dbml[:file] Output as dbml. Cannot be used with /map option.
/code[:file] Output as source code. Cannot be used with /dbml option.
/map[:file] Generate mapping file, not attributes. Cannot be used with /dbml option.
/language:<language> Language for source code: VB or C# (default: derived from extension on code file name).
/namespace:<name> Namespace of generated code (default: no namespace).
/context:<type> Name of data context class (default: derived from database name).
/entitybase:<type> Base class of entity classes in the generated code(default: entities have no base class).
/pluralize Automatically pluralize or singularize class and member names using English language rules.
/serialization:<option> Generate serializable classes: None or Unidirectional (default: None).
/provider:<type> Provider type: SQLCompact, SQL2000, SQL2005, or SQL2008. (default: provider is determined at run time).
<input file> May be a SqlExpress mdf file, a SqlCE sdf file, ora dbml intermediate file.
Create code from SqlServer:
SqlMetal /server:myserver /database:northwind /code:nwind.cs /namespace:nwind
Generate intermediate dbml file from SqlServer:
SqlMetal /server:myserver /database:northwind /dbml:northwind.dbml /namespace:nwind
Generate code with external mapping from dbml:
SqlMetal /code:nwind.cs /map:nwind.map northwind.dbml
Generate dbml from a SqlCE sdf file:
SqlMetal /dbml:northwind.dbml northwind.sdf
Generate dbml from SqlExpress local server:
SqlMetal /server:.\sqlexpress /database:northwind /dbml:northwind.dbml
Generate dbml by using a connection string in the command line:
SqlMetal /conn:"server='myserver'; database='northwind'" /dbml:northwind.dbml
這些說明就包括許多使用範例了,我想我應該不用贅述了。
相關連結