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