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

C# 實作自製 ORM(六):MiniORM 進階特性與完整實體範例

     編輯:關於C語言

唯一性約束:防止欄位重複值

需求:Person.Name 不可重複。新增時若發現重複即拋出例外。實作方式:定義無屬性無方法的標記型 Attribute:

public class DataFieldNotDoubleAttribute : Attribute { }

於屬性雙重標註:[DataFieldAttribute("name", "NvarChar")] + [DataFieldNotDoubleAttribute],ORM 寫入前自動檢查。

交易處理兩種方案比較

方案一:TransactionScope (System.Transactions)

支援分散式交易、巢狀交易,語法優雅:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) {
    Function2(); // 內層同樣使用 TransactionScope 可自動提升為分散式交易
    scope.Complete();
}

缺點:效能較差、設定複雜、跨資料庫伺服器常發生 MSDTC 設定問題。

方案二:SqlTransaction (ADO.NET 原生)

using (var conn = new SqlConnection(connStr)) {
    conn.Open();
    using (var trans = conn.BeginTransaction()) {
        // 執行命令...
        trans.Commit();
    }
}

缺點:不支援巢狀交易,需手動傳遞 SqlTransaction 物件給所有參與方法。

MiniORM 採用方案二,以效能與相容性優先。

最終 Person 實體完整定義

整合所有 Attribute 後的完整實體:

[DataObjectAttribute("Person", "ID", "")]
public class Person {
    private int _id; private string _name; private int _age; private string _sex;
    private Head _head; private Hand _leftHand; private Hand _rightHand;

    [DataFieldAttribute("ID", true)] // true 表示 Identity
    public int ID { get => _id; set => _id = value; }

    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "Person", "Person", "Head")]
    public Head Head { get => _head; set => _head = value; }

    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "Person", "Person", "Hand")]
    public Hand LeftHand { get => _leftHand; set => _leftHand = value; }

    [SubDataObjectAttribute(SubDataObjectFieldType.Object, "Person", "Person", "Hand")]
    public Hand RightHand { get => _rightHand; set => _rightHand = value; }

    [DataFieldAttribute("name", "NvarChar")]
    public string Name { get => _name; set => _name = value; }

    [DataFieldAttribute("age", "int")]
    public int Age { get => _age; set => _age = value; }

    [DataFieldAttribute("sex", "NvarChar")]
    public string Sex { get => _sex; set => _sex = value; }
}

建議搭配代碼產生器自動產生實體骨架,再手動微調 Attribute 參數。

ORM 優缺點總結與效能優化方向

  • 優點:80% 通用 CRUD 交給 ORM,減少手寫 SQL 錯誤,開發效率大增(二八原則)。
  • 缺點:反射帶來效能損耗;部分複雜查詢仍需手寫 SQL。
  • 優化路徑:動態生成代碼 + 執行期編譯(Expression Tree / IL Emit),將反射成本轉移至啟動階段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved