public async Task Migrations_in_a_race_do_not_throw()
        {
            InitializeDatabase <MigrationsTestEventStore>();

            var columnName = Any.CamelCaseName(3);
            var barrier    = new Barrier(2);

            var migrator = new AnonymousMigrator(c =>
            {
                c.Execute(string.Format(@"alter table [eventstore].[events] add {0} nvarchar(50) null", columnName));
                barrier.SignalAndWait(10000);
            }, version);

            var task1 = Task.Run(() => InitializeDatabase <MigrationsTestEventStore>(migrator));
            var task2 = Task.Run(() => InitializeDatabase <MigrationsTestEventStore>(migrator));

            await Task.WhenAll(task1, task2);

            using (var context = new MigrationsTestEventStore())
            {
                var result = context.QueryDynamic(
                    @"SELECT * FROM sys.columns WHERE name='@columnName'",
                    new Dictionary <string, object> {
                    { "columnName", columnName }
                }).Single();
                result.Should().BeEmpty();
            }
        }
        public void When_a_migration_throws_then_the_change_is_rolled_back()
        {
            InitializeDatabase <MigrationsTestEventStore>();

            var columnName = Any.CamelCaseName(3);

            try
            {
                InitializeDatabase <MigrationsTestEventStore>(
                    new AnonymousMigrator(c =>
                {
                    c.Execute(string.Format(@"alter table [eventstore].[events] add {0} nvarchar(50) null", columnName));
                    throw new DataMisalignedException();
                }, version));
            }
            catch (DataMisalignedException)
            {
            }

            GetAppliedVersions <MigrationsTestEventStore>().Should().NotContain(s => s == version.ToString());

            using (var context = new MigrationsTestEventStore())
            {
                var result = context.QueryDynamic(
                    @"SELECT * FROM sys.columns WHERE name='@columnName'",
                    new Dictionary <string, object> {
                    { "columnName", columnName }
                }).Single();
                result.Should().BeEmpty();
            }
        }
        public async Task Database_creations_in_a_race_do_not_throw()
        {
            var task1 = Task.Run(() => InitializeDatabase <MigrationsTestEventStore>());
            var task2 = Task.Run(() => InitializeDatabase <MigrationsTestEventStore>());

            await Task.WhenAll(task1, task2);

            using (var context = new MigrationsTestEventStore())
            {
                context.Database.Exists().Should().BeTrue();
            }
        }