在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);
}
});
});
}
