需求:Person.Name 不可重複。新增時若發現重複即拋出例外。實作方式:定義無屬性無方法的標記型 Attribute:
public class DataFieldNotDoubleAttribute : Attribute { }
於屬性雙重標註:[DataFieldAttribute("name", "NvarChar")] + [DataFieldNotDoubleAttribute],ORM 寫入前自動檢查。
支援分散式交易、巢狀交易,語法優雅:
using (var scope = new TransactionScope(TransactionScopeOption.Required)) {
Function2(); // 內層同樣使用 TransactionScope 可自動提升為分散式交易
scope.Complete();
}
缺點:效能較差、設定複雜、跨資料庫伺服器常發生 MSDTC 設定問題。
using (var conn = new SqlConnection(connStr)) {
conn.Open();
using (var trans = conn.BeginTransaction()) {
// 執行命令...
trans.Commit();
}
}
缺點:不支援巢狀交易,需手動傳遞 SqlTransaction 物件給所有參與方法。
MiniORM 採用方案二,以效能與相容性優先。
整合所有 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 參數。