public IReadOnlyList <AggregateRootEvent> GetAggregateHistory(Guid aggregateId, bool takeWriteLock, int startAfterInsertedVersion = 0) { var historyData = new List <EventDataRow>(); using (var connection = _connectionMananger.OpenConnection(suppressTransactionWarning: !takeWriteLock)) { using (var loadCommand = connection.CreateCommand()) { loadCommand.CommandText = $"{GetSelectClause(takeWriteLock)} WHERE {EventTable.Columns.AggregateId} = @{EventTable.Columns.AggregateId}"; loadCommand.Parameters.Add(new SqlParameter($"{EventTable.Columns.AggregateId}", aggregateId)); if (startAfterInsertedVersion > 0) { loadCommand.CommandText += $" AND {EventTable.Columns.InsertedVersion} > @CachedVersion"; loadCommand.Parameters.Add(new SqlParameter("CachedVersion", startAfterInsertedVersion)); } loadCommand.CommandText += $" ORDER BY {EventTable.Columns.EffectiveReadOrder} ASC"; using (var reader = loadCommand.ExecuteReader()) { while (reader.Read()) { var eventDataRow = ReadDataRow(reader); if (eventDataRow.EffectiveVersion > 0) { historyData.Add(eventDataRow); } } } } } return(historyData.Select(HydrateEvent).ToList()); }
private void SaveEventsInternal(IEnumerable <EventWithManualReadorder> events) { using (var connection = _connectionMananger.OpenConnection()) { foreach (var refactoringEvent in events) { var @event = refactoringEvent.Event; using (var command = connection.CreateCommand()) { command.CommandType = CommandType.Text; command.CommandText += $@" INSERT {EventTable.Name} With(READCOMMITTED, ROWLOCK) ( {EventTable.Columns.AggregateId}, {EventTable.Columns.InsertedVersion}, {EventTable.Columns.ManualVersion}, {EventTable.Columns.ManualReadOrder}, {EventTable.Columns.EventType}, {EventTable.Columns.EventId}, {EventTable.Columns.UtcTimeStamp}, {EventTable.Columns.Event}, {EventTable.Columns.InsertAfter}, {EventTable.Columns.InsertBefore}, {EventTable.Columns.Replaces}) VALUES(@{EventTable.Columns.AggregateId}, @{EventTable.Columns.InsertedVersion}, @{EventTable.Columns.ManualVersion}, @{EventTable.Columns.ManualReadOrder}, @{EventTable.Columns.EventType}, @{EventTable.Columns.EventId}, @{EventTable.Columns.UtcTimeStamp}, @{EventTable.Columns.Event}, @{EventTable.Columns.InsertAfter},@{EventTable.Columns.InsertBefore}, @{EventTable.Columns.Replaces}) SET @{EventTable.Columns.InsertionOrder} = SCOPE_IDENTITY();"; command.Parameters.Add(new SqlParameter(EventTable.Columns.AggregateId, @event.AggregateRootId)); command.Parameters.Add( new SqlParameter( EventTable.Columns.InsertedVersion, @event.InsertedVersion > @event.AggregateRootVersion ? @event.InsertedVersion : @event.AggregateRootVersion)); command.Parameters.Add(new SqlParameter(EventTable.Columns.EventType, IdMapper.GetId(@event.GetType()))); command.Parameters.Add(new SqlParameter(EventTable.Columns.EventId, @event.EventId)); command.Parameters.Add(new SqlParameter(EventTable.Columns.UtcTimeStamp, @event.UtcTimeStamp)); command.Parameters.Add(new SqlParameter(EventTable.Columns.ManualReadOrder, refactoringEvent.ManualReadOrder)); command.Parameters.Add(new SqlParameter(EventTable.Columns.Event, _eventSerializer.Serialize(@event))); command.Parameters.Add(Nullable(new SqlParameter(EventTable.Columns.ManualVersion, @event.ManualVersion))); command.Parameters.Add(Nullable(new SqlParameter(EventTable.Columns.InsertAfter, @event.InsertAfter))); command.Parameters.Add(Nullable(new SqlParameter(EventTable.Columns.InsertBefore, @event.InsertBefore))); command.Parameters.Add(Nullable(new SqlParameter(EventTable.Columns.Replaces, @event.Replaces))); var identityParameter = new SqlParameter(EventTable.Columns.InsertionOrder, SqlDbType.BigInt); identityParameter.Direction = ParameterDirection.Output; command.Parameters.Add(identityParameter); command.ExecuteNonQuery(); @event.InsertionOrder = (long)identityParameter.Value; } } } }