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

Hxj.Data 核心架構揭秘:Entity 基類、Field 靜態類、異動追蹤、Provider 抽象

     編輯:關於ASP.NET

實體類別完整原始碼剖析(以 Products 為例)

見原文完整程式碼,此處提煉核心架構設計:

1. Entity 基類核心契約

public abstract class Entity {
    protected Entity(string tableName) { TableName = tableName; }
    public string TableName { get; private set; }

    // 必須覆寫
    public abstract Field GetIdentityField();        // 自增/身分欄位
    public abstract Field[] GetPrimaryKeyFields();   // 主鍵陣列
    public abstract Field[] GetFields();             // 所有欄位
    public abstract object[] GetValues();            // 當前值陣列(與 GetFields 對應)
    public abstract void SetPropertyValues(IDataReader reader);
    public abstract void SetPropertyValues(DataRow row);

    // 異動追蹤
    protected void OnPropertyValueChange(Field field, object oldValue, object newValue) {
        if (!object.Equals(oldValue, newValue)) ModifiedFields.Add(field);
    }
    public List ModifiedFields { get; } = new List();
    public void Attach() { ModifiedFields.Clear(); } // 開啟追蹤
    public void ClearModifiedFields() { ModifiedFields.Clear(); }
}

2. Field 類別:欄位元資料攜帶者

public class Field {
    public string Name { get; }        // 資料庫欄位名
    public string TableName { get; }   // 所屬表名
    public string Alias { get; }       // 別名

    // 運算子多載支援 WhereClip 建構
    public static WhereClip operator ==(Field f, object v) { ... }
    public static WhereClip operator >(Field f, object v) { ... }
    // ... 其他比較運算子

    // 聚合/字串函數
    public Field Count() { ... }
    public Field Sum() { ... }
    public Field As(string alias) { ... }
    // ... Left/Right/Substring/Trim 等
}

3. Provider 抽象層:跨資料庫可攜性核心

  • IDbProvider:建立連線、命令、參數、資料型別對應、SQL 方言(分頁、自增、引號)。
  • 實作:SqlServerProvider, SqlServer9Provider, OracleProvider, MySqlProvider, SqliteProvider, MsAccessProvider。
  • 核心差異封裝:GetPagingSql, GetIdentitySql, QuoteIdentifier, ParameterPrefix。

4. 異動追蹤機制流程

  1. entity.Attach() 清空 ModifiedFields。
  2. 屬性 Setter 呼叫 OnPropertyValueChange,異動欄位加入列表。
  3. Update(entity) 讀取 ModifiedFields 產生 SET col=@val,僅更新異動欄位。
  4. Insert(entity) 若已 Attach,同樣只插入異動欄位(其餘用資料庫預設值)。

5. 參數化與防注入

  • 所有值透過 DbParameter 傳遞,從不拼接字串。
  • 參數名稱自動生成(@p0, @p1...),避免衝突。
  • Provider 負責建立正確型別的 DbParameter(如 Oracle 需 OracleParameter)。

6. 擴充點

  • 自訂 Entity 衍生類別覆寫 GetSequence() (Oracle)、OnInserting/OnUpdating (攔截器)。
  • 實作 IDbProvider 支援新資料庫(如 PostgreSQL、Firebird)。
  • 註冊 RegisterSqlLogger 攔截 SQL 進行審計、效能分析。

Hxj.Data 以 Entity 基類 + Field 元資料 + Provider 抽象 + 異動追蹤 四大支柱,構建出輕量、強型別、跨資料庫、可擴充的 ORM 核心,程式碼總量不足 5000 行,卻支撐企業級應用完整需求。

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