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

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)。
DataFieldAttributepublic 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)] 標記主鍵自增。
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")]。運行時通過反射動態創建關聯實例。
DataFieldNotDoubleAttribute標記字段值不可重複 (如 UserName),寫入前自動檢查。
public class DataFieldNotDoubleAttribute : Attribute { }
| 方案 | 優點 | 缺點 |
|---|---|---|
COM+ / TransactionScope | 代碼優雅、支援分佈式事務、自動升級 | 性能損耗大、配置複雜、跨機器 DTC 常失敗 |
SqlTransaction (ADO.NET) | 輕量、可控、性能好 | 不支援嵌套事務、需手動傳遞 SqlTransaction 物件 |
建議:MiniORM 採用 SqlTransaction,通過參數傳遞實現事務邊界控制。
[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; }
}
Expression Tree 動態編譯委托、IL Emit 生成動態方法、源代碼生成器 (Source Generator)。IsIdentity 混在 DataFieldAttribute 中。優化:拆分為獨立 IdentityAttribute。遵循 2/8 原則:80% 標準化操作交給 ORM,20% 複雜場景手寫 SQL,平衡開發效率與性能。