public async Task <AsyncResult <DomainEventAppendResult> > AppendAsync(IDomainEvent domainEvent) { Assert.NotNull(domainEvent, nameof(domainEvent)); Assert.NotNullOrEmpty(domainEvent.Id, nameof(domainEvent.Id)); Assert.NotNullOrEmpty(domainEvent.AggregateRootId, nameof(domainEvent.AggregateRootId)); Assert.NotNullOrEmpty(domainEvent.AggregateRootTypeName, nameof(domainEvent.AggregateRootTypeName)); Assert.NotNullOrEmpty(domainEvent.CommandId, nameof(domainEvent.CommandId)); var storedEvent = StoredDomainEventAdapter.ToStoredDomainEvent(domainEvent, _serializer); var sql = string.Format(InsertSql, GetShardTableName(domainEvent.AggregateRootId)); try { using (var connection = new SqlConnection(_options.ConnectionString)) { await connection.ExecuteAsync(sql, storedEvent); return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success)); } } catch (SqlException ex) { _logger.LogError("Append domain event has sql exception, eventInfo: " + storedEvent, ex); if (ex.Number == 1062 && ex.Message.Contains(_versionIndexName)) { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateEvent)); } else if (ex.Number == 1062 && ex.Message.Contains(_commandIndexName)) { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateCommand)); } else { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed)); } } catch (Exception ex) { _logger.LogError("Append domain event has sql unknown, eventInfo: " + storedEvent, ex); return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed, ex.Message)); } }
public async Task <AsyncResult <DomainEventAppendResult> > AppendAllAsync(DomainEventStream eventStream) { Assert.NotNull(eventStream, nameof(eventStream)); Assert.NotNullOrEmpty(eventStream.AggregateRootId, nameof(eventStream.AggregateRootId)); Assert.NotNullOrEmpty(eventStream.AggregateRootTypeName, nameof(eventStream.AggregateRootTypeName)); Assert.LengthGreaterThan(nameof(eventStream.Events), eventStream.Events.Count(), 0); var sql = string.Format(InsertSql, GetShardTableName(eventStream.AggregateRootId)); var storedEvents = eventStream.Events.Select(it => StoredDomainEventAdapter.ToStoredDomainEvent(it, _serializer)); try { using (var connection = new SqlConnection(_options.ConnectionString)) { await connection.OpenAsync(); var transaction = await connection.BeginTransactionAsync(); try { using (var copy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction)) { copy.BatchSize = eventStream.Events.Count(); copy.BulkCopyTimeout = _appendEventStreamTimeoutInSeconds; copy.DestinationTableName = GetShardTableName(eventStream.AggregateRootId); await copy.WriteToServerAsync(BuildStoreEventTableStructure()); await transaction.CommitAsync(); } return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success)); } catch (Exception) { try { await transaction.RollbackAsync(); } catch (Exception ex) { _logger.LogError($"the method{nameof(AppendAllAsync)}'s transaction rollback failed.", ex); } throw; } } } catch (SqlException ex) { _logger.LogError("Apend all domain events associated with a aggregation has sql exception.", ex); if (ex.Number == 2601 && ex.Message.Contains(_versionIndexName)) { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateEvent)); } else if (ex.Number == 2601 && ex.Message.Contains(_commandIndexName)) { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Success, DomainEventAppendResult.DuplicateCommand)); } else { return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed)); } } catch (Exception ex) { _logger.LogError("Apend all domain events associated with a aggregation has unknown exception.", ex); return(new AsyncResult <DomainEventAppendResult>(AsyncStatus.Failed)); } }