public Task <ApiResult> AddAsync(SystemInfoAllDTO model)
 {
     return(factory.GetGrain <IDataSyncSettingAllStateGrain>(System.Guid.Empty).AddAsync(model));
 }
        public async Task <ApiResult> AddAsync(SystemInfoAllDTO model)
        {
            //参数校验
            if (!model.IsValid(out string exMsg))
            {
                return(ApiResultUtil.IsFailed(exMsg));
            }

            if (State.SystemInfos.Any(m => m.SystemName == model.SystemName || m.DbConnection == model.DbConnection))
            {
                return(ApiResultUtil.IsFailed("系统或数据库配置已存在!"));
            }

            long systemId = await this.GrainFactory.GetGrain <IUtcUID>(GrainIdKey.UtcUIDGrainKey).NewLongID();

            var systemInfoDO = this.ObjectMapper.Map <SystemInfoDO>(model);

            systemInfoDO.Id         = systemId;
            systemInfoDO.CreateDate = System.DateTime.Now;
            systemInfoDO.ModityDate = System.DateTime.Now;

            List <TableInfoDO>  tableInfos  = new List <TableInfoDO>();
            List <ColumnInfoDO> columnInfos = new List <ColumnInfoDO>();

            foreach (var table in model.Tables)
            {
                if (tableInfos.Any(mbox => mbox.TableName == table.TableName))
                {
                    return(ApiResultUtil.IsFailed($"表名称【{table.TableName}】重复!"));
                }

                long tableId = await this.GrainFactory.GetGrain <IUtcUID>(GrainIdKey.UtcUIDGrainKey).NewLongID();

                var tableInfoDO = this.ObjectMapper.Map <TableInfoDO>(table);
                tableInfoDO.SystemId   = systemId;
                tableInfoDO.Id         = tableId;
                tableInfoDO.CreateDate = System.DateTime.Now;
                tableInfoDO.ModityDate = System.DateTime.Now;

                foreach (var column in table.Columns)
                {
                    if (columnInfos.Any(mbox => mbox.TableId == tableId && mbox.SelfColumn == column.SelfColumn))
                    {
                        return(ApiResultUtil.IsFailed($"列名称【{column.SelfColumn}】重复!"));
                    }

                    long columnId = await this.GrainFactory.GetGrain <IUtcUID>(GrainIdKey.UtcUIDGrainKey).NewLongID();

                    var columnInfo = this.ObjectMapper.Map <ColumnInfoDO>(column);
                    columnInfo.TableId    = tableId;
                    columnInfo.Id         = columnId;
                    columnInfo.CreateDate = System.DateTime.Now;
                    columnInfo.ModityDate = System.DateTime.Now;

                    columnInfos.Add(columnInfo);
                }

                tableInfos.Add(tableInfoDO);
            }

            var bRet = await _systemInfoRepository.BeginTransactionAsync(async transaction =>
            {
                var result = await _systemInfoRepository.AddAsync(systemInfoDO);

                _tableInfoRepository.Transaction = transaction;
                result &= await _tableInfoRepository.AddAsync(tableInfos.ToArray());

                _columnInfoRepository.Transaction = transaction;
                result &= await _columnInfoRepository.AddAsync(columnInfos.ToArray());
                transaction.Commit();
                return(result);
            });

            var state = this.State;

            state.SystemInfos.Add(systemInfoDO);
            state.TableInfos.AddRange(tableInfos);
            state.ColumnInfos.AddRange(columnInfos);

            //刷新缓存
            var groupCodes = tableInfos.Select(mbox => mbox.GroupCode).Distinct();

            await RefrshGroupState(groupCodes.ToList());

            await this.Persist(Kaneko.Core.Contract.ProcessAction.Create, state);

            return(bRet ? ApiResultUtil.IsSuccess() : ApiResultUtil.IsFailed("数据保存失败!"));
        }