上文《ORM 中的繼承關係映射全解》示範各種繼承映射,但「一實體一具體表」與「一實體一擴展表」方案下,子類儲存需手動 Save 實體本身及所有父類對應表,使用者難以掌握完整表結構。NBear v2.1.6 引入 ActiveEntity 類解決此問題。
// 泛型參數:必須實作 IEntity
public class ActiveEntity<IEntityType> where IEntityType : IEntity
// 建構函式
public ActiveEntity(Gateway gateway, IEntityType obj) // 基於既有實體
public ActiveEntity(Gateway gateway, params object[] pkValues) // 依主鍵載入,或建立新實體
// 屬性
public ActiveEntityStatus Status { get; } // New / Loaded
public IEntityType Entity { get; } // 直接讀寫實體屬性
// 方法
public void Save() / Save(DbTransaction tran)
public void Delete() / Delete(DbTransaction tran)
[Table("Categories")]
public interface Category : IEntity {
[PrimaryKey] int CategoryID { get; }
string CategoryName { get; set; }
string Description { get; set; }
byte[] Picture { get; set; }
}
// 載入現有
ActiveEntity<Category> obj = new ActiveEntity<Category>(gateway, 1);
obj.Entity.CategoryName = "NewName";
obj.Save(); // 僅更新 CategoryName 欄位
// 新增
ActiveEntity<Category> obj2 = new ActiveEntity<Category>(gateway);
obj2.Entity.CategoryName = "NewCategory";
obj2.Save(); // INSERT
obj2.Delete(); // DELETE
Gateway.ExecuteProcedureXXX 新增支援預存程序輸出參數。Gateway.Save 可能導致交易死鎖的 Bug。更多細節請參閱 NBear 中文使用手冊。