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

構建屬於自己的 MiniORM 框架 (二):核心映射特性設計與事務處理策略

     編輯:關於C#

承接上篇 ORM 基礎概念,本文詳細設計 MiniORM 的核心映射特性 (Attribute)、三大核心類架構、繼承/組合映射策略、事務處理方案。

架構設計:三大核心類

  • OrmWriter:負責實體對象插入/更新 (Insert/Update)。
  • OrmRemover:負責根據實體對象刪除記錄 (Delete)。
  • OrmReader:負責根據實體對象查詢記錄 (Select)。

MiniORM三大類結構

映射特性體系

1. 表映射:DataObjectAttribute

[AttributeUsage(AttributeTargets.Class)]
public class DataObjectAttribute : Attribute {
    public string TableName { get; }
    public string PrimaryKey { get; }
    public string ForeignKey { get; } // 簡化:單 FK
    public DataObjectAttribute(string table, string pk, string fk) { ... }
}

用法:[DataObjectAttribute("Person", "ID", "")] (Person 表無 FK)。

2. 字段映射:DataFieldAttribute

public class DataFieldAttribute : Attribute {
    public string FieldName { get; }
    public string FieldType { get; } // "int", "NvarChar" 等
    public bool IsIdentity { get; }  // 是否自增列
    public DataFieldAttribute(string name, string type) { ... }
    public DataFieldAttribute(string name, bool isIdentity) { ... } // 簡化構造
}

用法:[DataFieldAttribute("ID", true)] 標記主鍵自增。

3. 關聯對象映射:SubDataObjectAttribute

支援單對象 (Object) 與集合 (List) 兩種關聯類型。

public enum SubDataObjectFieldType { Object, List }

public class SubDataObjectAttribute : Attribute {
    public SubDataObjectFieldType FieldType { get; }
    public string AssemblyName { get; }
    public string NamespaceName { get; }
    public string ClassName { get; }
    public SubDataObjectAttribute(SubDataObjectFieldType type, string asm, string ns, string cls) { ... }
}

用法:[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]。運行時通過反射動態創建關聯實例。

4. 唯一性約束:DataFieldNotDoubleAttribute

標記字段值不可重複 (如 UserName),寫入前自動檢查。

public class DataFieldNotDoubleAttribute : Attribute { }

事務處理方案對比

方案優點缺點
COM+ / TransactionScope代碼優雅、支援分佈式事務、自動升級性能損耗大、配置複雜、跨機器 DTC 常失敗
SqlTransaction (ADO.NET)輕量、可控、性能好不支援嵌套事務、需手動傳遞 SqlTransaction 物件

建議:MiniORM 採用 SqlTransaction,通過參數傳遞實現事務邊界控制。

完整 Person 實體示例

[DataObjectAttribute("Person", "ID", "")]
public class Person {
    [DataFieldAttribute("ID", true)] public int ID { get; set; }
    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]
    public Head Head { get; set; }
    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
    public Hand LeftHand { get; set; }
    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
    public Hand RightHand { get; set; }
    [DataFieldAttribute("name", "NvarChar")] public string Name { get; set; }
    [DataFieldAttribute("age", "int")] public int Age { get; set; }
    [DataFieldAttribute("sex", "NvarChar")] public string Sex { get; set; }
}

ORM 缺點與優化方向

  • 性能:全反射動態構造 SQL 有開銷。優化:Expression Tree 動態編譯委托、IL Emit 生成動態方法、源代碼生成器 (Source Generator)。
  • 臃腫代碼:如 IsIdentity 混在 DataFieldAttribute 中。優化:拆分為獨立 IdentityAttribute。
  • 功能覆蓋:僅解決 80% 通用 CRUD,複雜查詢仍需手寫 SQL。

遵循 2/8 原則:80% 標準化操作交給 ORM,20% 複雜場景手寫 SQL,平衡開發效率與性能。

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