難度 50,定位入門級。以部落格系統為例,核心實體:User、Blog、Post。一個用戶擁有一個部落格,一部落格可有零或多篇文章。
public class User {
public int Id { get; set; }
public Blog Blog { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string NickName { get; set; }
public DateTime LeaveTime { get; set; }
}
public class Blog {
public int Id { get; set; }
public int UserId { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public IList<Post> Posts { get; set; }
}
public class Post {
public int Id { get; set; }
public int BlogId { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public DateTime CreateDate { get; set; }
}
Users、Blogs、Posts 三張表(表名用複數遵循 Rails/ActiveRecord 慣例)。User 的 LeaveTime 不持久化,僅供線上統計暫存。



以 Post 為例:
[Table(Name="posts")]
public class Post {
[Column(Name="postid", IsPrimaryKey=true, IsDbGenerated=true)] public int Id { get; set; }
[Column] public int BlogId { get; set; }
[Column] public string Title { get; set; }
[Column] public string Body { get; set; }
[Column] public DateTime CreateDate { get; set; }
}
DataContext 為入口點,負責查詢轉譯、執行、連線管理。建立實例:
DataContext dbContext = new DataContext(ConfigurationManager.ConnectionStrings["CnBlogs"].ConnectionString);
dbContext.Log = Console.Out; // 顯示產生的 SQL
Table<Post> posts = dbContext.GetTable<Post>();
完整查詢:
foreach(var post in posts) Console.WriteLine(post.Title);
產生標準 SQL(如圖)。

var posts = from post in dbContext.GetTable<Post>()
where post.BlogId == 2
select post;
產生參數化 SQL,防止 SQL Injection 並利用快取。

支援 C# 方法轉譯,如 StartsWith 轉為 LIKE:
var posts = from post in dbContext.GetTable<Post>()
where post.Title.StartsWith("y")
select post;

注意:非所有 C# 方法皆可轉譯(如 ToString("yyyy-MM-dd") 會失敗)。
Table<Post> posts = dbContext.GetTable<Post>();
Post post = new Post { BlogId=2, Title="test", Body="test...", CreateDate=DateTime.Now };
posts.InsertOnSubmit(post);
dbContext.SubmitChanges(); // 真正執行
Console.WriteLine(post.Id); // 取得自增 ID
產生 INSERT + SELECT SCOPE_IDENTITY()。
須將 Id 設為 IsDbGenerated=true,否則 .NET 預設值 0 會導致錯誤。

更新:查詢 → 修改屬性 → SubmitChanges() 自動產生 UPDATE。
刪除:呼叫 DeleteOnSubmit → SubmitChanges()。
本篇完整介紹單表 CRUD 基礎操作。下一篇將深入多表聯結、關聯對應與延遲執行機制。