承接前兩篇(LINQ 查詢與儲存程序),本文介紹 Visual Studio 內建的 LINQ to SQL 設計工具(.dbml),以視覺化方式建立實體類別與資料庫對應,取代手寫 Attribute 映射。
Northwind.dbmlApp_Code 產生三個檔案:
Northwind.dbml:XML 格式的對應定義Northwind.dbml.layout:設計介面版面資訊Northwind.designer.cs:自動產生的 DataContext 與實體類別
Employees 資料表拖曳至 DBML 設計面Employee 實體類別與 NorthwindDataContext
// NorthwindDataContext 繼承 DataContext
public partial class NorthwindDataContext : System.Data.Linq.DataContext {
public System.Data.Linq.Table<Employee> Employees;
// ... 其他 Table 屬性
public NorthwindDataContext() : base(global::System.Configuration.ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString) { }
}
// 實體類別對應 Employees 資料表
[Table(Name="dbo.Employees")]
public partial class Employee : INotifyPropertyChanging, INotifyPropertyChanged {
[Column(Storage="_EmployeeID", DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int EmployeeID { get; set; }
[Column(Storage="_FirstName", DbType="NVarChar(20)")]
public string FirstName { get; set; }
[Column(Storage="_LastName", DbType="NVarChar(20)")]
public string LastName { get; set; }
// ... 其他欄位
}
// 查詢範例
using (var db = new NorthwindDataContext()) {
var emps = from e in db.Employees
where e.City == "London"
select new { e.EmployeeID, e.FirstName, e.LastName };
GridView1.DataSource = emps;
GridView1.DataBind();
}
// 新增範例
using (var db = new NorthwindDataContext()) {
var emp = new Employee {
FirstName = "John",
LastName = "Doe",
Title = "Sales Representative",
HireDate = DateTime.Now
};
db.Employees.InsertOnSubmit(emp);
db.SubmitChanges(); // 實際寫入資料庫
}
EntitySet / EntityRef 導覽屬性Employee.partial.cs 加入驗證邏輯或計算屬性,不影響重新產生| 問題 | 解決 |
|---|---|
| 資料庫結構變更後實體不同步 | 重新拖曳資料表,或右鍵設計面 → 「重新整理」 |
| 連接字串部署時需修改 | 建構函式預設讀取 web.config,直接修改 connectionStrings 區段即可 |
| 效能:大量資料載入慢 | 使用 DataLoadOptions 指定 LoadWith 減少 N+1 查詢 |