在ZKEACMS Core中使用事务
ZKEASOFT March 20, 2018
ZKEACMS Core使用EntityFrameWork Core访问数据库,因此使用事务的方式也和EntityFrameWork Core一样,只是进行了简单的封装。
有关于更多EntityFrameWork Core的事务,请稳步至微软文档:https://docs.microsoft.com/en-us/ef/core/saving/transactions
同步提交
EntityFrameWork Core中使用SaveChanges来同步提交所有修改请求,这些请求是在一个事务里面的。但在ZKEACMS里面,为了方便使用,每一次的Update/Add都会提交请求。可以使用以下方式来实现同步提交:
Service.BeginBulkSave();
...
...
Service.SaveChanges();
例如在焦点图的保存过程中,就使用了以上方式:
_carouselItemService.BeginBulkSave(); item.CarouselItems.Each(m => { m.CarouselID = item.ID; if (m.ActionType == ActionType.Create) { var itemResult = _carouselItemService.Add(m); if (itemResult.HasViolation) { result.RuleViolations.AddRange(itemResult.RuleViolations); } } }); _carouselItemService.SaveChanges();
BeginTransaction
使用事务的第二种方式是使用BeginTransaction来开始一个事务。使用方式也很简单:
BeginTransaction(()=>{});
例如在发布页面中就使用了这种方式,这种方式可以更方便的协调多个Service:
public void Publish(PageEntity item) { BeginTransaction(() => { item = Get(item.ID); item.IsPublish = true; item.PublishDate = DateTime.Now; base.Update(item); _widgetService.RemoveCache(item.ID); item.ReferencePageID = item.ID; item.IsPublishedPage = true; item.PublishDate = DateTime.Now; var widgets = _widgetService.GetByPageId(item.ID); Add(item); widgets.Each(m => { using (var widgetService = _widgetActivator.Create(m)) { m = widgetService.GetWidget(m); m.PageID = item.ID; widgetService.IsNeedNotifyChange = false; widgetService.Publish(m); } }); }); }