예제 #1
0
        public void Save(IEventProvider eventProvider)
        {
            if (!_isRunningWithinTransaction)
            {
                throw new Exception("Opperation is not running within a transaction");
            }

            var version = GetEventProviderVersion(eventProvider, _sqLiteTransaction);

            if (version != eventProvider.Version)
            {
                throw new ConcurrencyViolationException();
            }

            foreach (var domainEvent in eventProvider.GetChanges())
            {
                SaveEvent(domainEvent, eventProvider, _sqLiteTransaction);
            }

            eventProvider.UpdateVersion(eventProvider.Version + eventProvider.GetChanges().Count());
            UpdateEventProviderVersion(eventProvider, _sqLiteTransaction);
        }
예제 #2
0
        private static void UpdateAggregateVersion(IEventProvider eventProvider)
        {
            const string updateProviderVersion = @"UPDATE EventSource SET Version = @version WHERE Id = @id;";

            eventProvider.UpdateVersion();

            using (var connection = new MySqlConnection(connectionString)) {
                using (var command = connection.CreateCommand()) {
                    command.CommandText = updateProviderVersion;
                    command.Parameters.Add("@id", MySqlDbType.Guid).Value = eventProvider.Id;
                    command.Parameters.Add("@version", MySqlDbType.Int64).Value = eventProvider.Version;

                    connection.Open();
                    command.ExecuteNonQuery();
                }
            }
        }