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

Linq to SQL 實體增刪改的封裝模式:避免硬編碼 Table 名稱

     編輯:關於.NET

痛點

專案到處散落 db.Customers.InsertOnSubmit(c); db.SubmitChanges();。若未來 Customers 拆表、重命名、或遷移至其他 ORM,修改成本極高且易漏改。

解決方案:在 DataContext 繼承類中封裝領域操作方法

public partial class MyDataContext : DataContext
{
    // 建構子略...

    // 封裝 Insert
    public void InsertCustomer(Customer customer)
    {
        this.GetTable<Customer>().InsertOnSubmit(customer);
        this.SubmitChanges();
    }

    // 封裝 Update (實體已附加或透過 Attach)
    public void UpdateCustomer(Customer customer)
    {
        // 視追蹤狀態決定 Attach/Refresh 邏輯
        this.SubmitChanges();
    }

    // 封裝 Delete
    public void DeleteCustomer(Customer customer)
    {
        this.GetTable<Customer>().DeleteOnSubmit(customer);
        this.SubmitChanges();
    }
}
DataContext 封裝方法

呼叫端簡化

// 原始碼散落處
db.Customers.InsertOnSubmit(c); db.SubmitChanges();

// 改為
db.InsertCustomer(c); // 單一入口,內部可擴展驗證、日誌、事務等

進階擴展:通用 Repository 基類

public class Repository<TEntity> where TEntity : class
{
    protected readonly DataContext _context;
    protected readonly Table<TEntity> _table;

    public Repository(DataContext context) {
        _context = context;
        _table = context.GetTable<TEntity>();
    }

    public virtual void Insert(TEntity entity) {
        _table.InsertOnSubmit(entity);
        _context.SubmitChanges();
    }
    public virtual void Delete(TEntity entity) {
        _table.DeleteOnSubmit(entity);
        _context.SubmitChanges();
    }
    public virtual void Save() => _context.SubmitChanges();
}

// 使用
var customerRepo = new Repository<Customer>(db);
customerRepo.Insert(new Customer { ... });

總結

將 InsertOnSubmit/DeleteOnSubmit/SubmitChanges 封裝於 DataContext 分部類 或 Repository 中,實現「資料操作入口單一化」,隔離資料結構變更對業務代碼的衝擊,符合依賴倒置與單一職責原則。

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