本系列以相同資料表 (UserInfo) 實作 CRUD,對比 ADO.NET、NHibernate、Linq to SQL、Entity Framework 四種方式。EF 為微軟較晚推出的 ORM,修正 Linq to SQL 單一資料庫限制,並提供 Linq to Entities、Entity SQL、EntityKey 多種查詢管道。

public class EntityFrameworkCRUD
{
public int Count()
{
using (var ctx = new AspNetStudyEntities())
return ctx.UserInfo.Count();
}
public void Create(UserInfo info)
{
using (var ctx = new AspNetStudyEntities())
{
ctx.AddToUserInfo(info);
ctx.SaveChanges();
}
}
public UserInfo Read(int userId)
{
using (var ctx = new AspNetStudyEntities())
{
var key = new EntityKey("AspNetStudyEntities.UserInfo", "UserID", userId);
return ctx.GetObjectByKey(key) as UserInfo;
}
}
public void Update(UserInfo info)
{
using (var ctx = new AspNetStudyEntities())
{
var ui = ctx.UserInfo.First(u => u.UserID == info.UserID);
ui.Age = info.Age; ui.Email = info.Email; ui.Mobile = info.Mobile;
ui.Phone = info.Phone; ui.RealName = info.RealName; ui.Sex = info.Sex;
ui.UserName = info.UserName;
ctx.SaveChanges();
}
}
public void Delete(int userId)
{
using (var ctx = new AspNetStudyEntities())
{
var ui = ctx.UserInfo.First(u => u.UserID == userId);
ctx.DeleteObject(ui);
ctx.SaveChanges();
}
}
public int GetMaxUserId()
{
using (var ctx = new AspNetStudyEntities())
return ctx.UserInfo.Max(u => u.UserID);
}
}
測試涵蓋 Count、Create、Read、Update、Delete (依 ID/實體) 等情境,全數通過。
| 維度 | ADO.NET | ORM (EF/NH/L2S) |
|---|---|---|
| 執行效能 | 最高 (直連 SQL) | 略低 (轉譯開銷) |
| 開發速度 | 較慢 (手寫 SQL/映射) | 快 (物件導向、自動映射) |
| 資料庫變更彈性 | 低 (多層修改) | 高 (僅調整映射/實體) |
| 程式碼一致性/可維護性 | 依賴開發者風格 | 框架強制統一風格 |
EF 四種查詢方式提供情境彈性:Linq to Entities (強型別)、Entity SQL (動態查詯、僅支援 Select)、EntityKey (主鍵直取)、原生 SQL。技術選型應依專案規模、團隊經驗、效能需求、資料庫異構度綜合判斷。