見原文完整程式碼,此處提煉核心架構設計:
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(); }
}
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 等
}
IDbProvider:建立連線、命令、參數、資料型別對應、SQL 方言(分頁、自增、引號)。SqlServerProvider, SqlServer9Provider, OracleProvider, MySqlProvider, SqliteProvider, MsAccessProvider。GetPagingSql, GetIdentitySql, QuoteIdentifier, ParameterPrefix。entity.Attach() 清空 ModifiedFields。OnPropertyValueChange,異動欄位加入列表。Update(entity) 讀取 ModifiedFields 產生 SET col=@val,僅更新異動欄位。Insert(entity) 若已 Attach,同樣只插入異動欄位(其餘用資料庫預設值)。DbParameter 傳遞,從不拼接字串。@p0, @p1...),避免衝突。DbParameter(如 Oracle 需 OracleParameter)。Entity 衍生類別覆寫 GetSequence() (Oracle)、OnInserting/OnUpdating (攔截器)。IDbProvider 支援新資料庫(如 PostgreSQL、Firebird)。RegisterSqlLogger 攔截 SQL 進行審計、效能分析。Hxj.Data 以 Entity 基類 + Field 元資料 + Provider 抽象 + 異動追蹤 四大支柱,構建出輕量、強型別、跨資料庫、可擴充的 ORM 核心,程式碼總量不足 5000 行,卻支撐企業級應用完整需求。