詳細說明 DbSession 執行資料新增的六種模式、Detach 進階用法與 InsertCreator 建構器。
public class DataExample : DbSession {
public DataExample() : base("DataExample") { /* 日誌註冊 */ }
public int Insert<T>(T item) where T : Entity { item.Detach(); return base.Save(item); }
public int Update<T>(T item) where T : Entity { item.Attach(); return base.Save(item); }
// 批次新增擴充
public int Insert<T>(IList<T> items) where T : Entity {
int ret = 0; foreach (var item in items) ret += Insert(item); return ret;
}
}
核心:Save 統一方法,外部透過 Attach()/Detach() 控制實體狀態。
var product = new Products { ProductName = "測試產品1" };
DataAccess.ExampleSession.Save(product);
var list = Enumerable.Range(0, 10).Select(i => new Products { ProductName = "測試" + i }).ToList();
var batch = DataAccess.ExampleSession.BeginBatch(10);
list.ForEach(item => batch.Save(item));
batch.Process();
同更新章節模式,將 Attach() 改為 Detach() 或省略(新實體預設為 Detach 狀態)。
product.Detach(Products._.CategoryID); // 排除單一欄位
product.Detach(Field.All.Remove(Products._.ProductName)); // 僅包含指定欄位
product.DetachAll(Products._.CategoryID);
product.DetachAll(Field.All.Remove(Products._.ProductName));
差異:Detach 疊加排除,DetachAll 清除後重新設定。
var product = new Products { ProductID = 1, ProductName = "測試" };
DataAccess.ExampleSession.InsertOrUpdate(product); // 依主鍵自動判斷
var ic = InsertCreator.NewCreator().From<Products>().SetEntity<Products>(product);
DataAccess.ExampleSession.Execute(ic);
var ic = InsertCreator.NewCreator().From("Products").AddInsert("ProductName", "測試");
DataAccess.ExampleSession.Execute(ic);
var ic = InsertCreator.NewCreator()
.From("Products").AddInsert("ProductName", "測試")
.SetIdentityField("ProductID");
int productID;
DataAccess.ExampleSession.Execute(ic, out productID);
以上皆可搭配交易:trans.Execute(ic)。