首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ADO.NET 與 ORM 實戰對比 (三):Linq to SQL 實作 CRUD 全紀錄

     編輯:關於.NET

Linq to SQL 為微軟首款原生 ORM,僅支援 SQL Server,但開發體驗遠優於 NHibernate。透過 .dbml 設計師拖曳資料表自動生成實體類別與 DataContext 子類別,極大簡化映射工作。

.dbml 設計師操作流程

  1. 專案加入「Linq to SQL 類別」(.dbml)
  2. 開啟「伺服器總管」建立/選取資料庫連線
  3. 將資料表拖曳至設計介面,自動生成實體類別與關聯
  4. 實體程式碼位於 .dbml.designer.cs (含 UserInfoDataClassesDataContext)

加入 DBML 設計師介面 資料庫連線 展開資料表 拖曳生成實體 設計師生成代碼

CRUD 核心程式碼 (LinqCRUD)

public class LinqCRUD
{
    public int Count()
    {
        // 方式二:強型別 DataContext (推薦)
        var ctx = new UserInfoDataClassesDataContext();
        return ctx.UserInfo.Count();
    }

    public void Create(UserInfo info)
    {
        var ctx = new UserInfoDataClassesDataContext();
        ctx.UserInfo.InsertOnSubmit(info);
        ctx.SubmitChanges();
    }

    public UserInfo Read(int userId)
    {
        var ctx = new UserInfoDataClassesDataContext();
        ctx.Log = Console.Out;  // 輸出 SQL
        return ctx.UserInfo.First(u => u.UserID == userId);
    }

    public void Update(UserInfo info)
    {
        var ctx = new UserInfoDataClassesDataContext();
        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.SubmitChanges();
    }

    public void Delete(int userId)
    {
        var ctx = new UserInfoDataClassesDataContext();
        var ui = ctx.UserInfo.First(u => u.UserID == userId);
        ctx.UserInfo.DeleteOnSubmit(ui);
        ctx.SubmitChanges();
    }

    public void Delete(UserInfo info)
    {
        var ctx = new UserInfoDataClassesDataContext();
        var list = from u in ctx.UserInfo where u.UserID == info.UserID select u;
        foreach (var u in list) ctx.UserInfo.DeleteOnSubmit(u);
        ctx.SubmitChanges();
    }

    public int GetMaxUserId()
    {
        var ctx = new UserInfoDataClassesDataContext();
        return ctx.UserInfo.Max(u => u.UserID);
    }
}

關鍵機制解析

  • UserInfoDataClassesDataContext 繼承 DataContext,為 .dbml 自動生成的強型別上下文
  • InsertOnSubmit/DeleteOnSubmit 標記變更,SubmitChanges 一次性提交
  • ctx.Log 可即時觀察生成 SQL,極利除錯
  • 刪除實體時必須先查詢附加至上下文,直接 DeleteOnSubmit(info) 會失效 (游離物件)

NUnit 測試驗證

測試案例同前,全數通過。Linq to SQL 開發效率顯著優於 NHibernate,但受限於單一資料庫支援,實務常轉向 Entity Framework。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved