Пример #1
0
        public void InitializeDatabase(TContext context)
        {
            EntityConnection connection = (EntityConnection)context.ObjectContext.Connection;

            if (connection.State != ConnectionState.Open)
            {
                return;
            }
            if (connection.CurrentTransaction == null)
            {
                return;
            }
            try
            {
                using (new TransactionScope(TransactionScopeOption.Suppress))
                    context.Transactions.AsNoTracking <TransactionRow>().WithExecutionStrategy <TransactionRow>((IDbExecutionStrategy) new DefaultExecutionStrategy()).Count <TransactionRow>();
            }
            catch (EntityException ex)
            {
                IEnumerable <MigrationStatement> migrationStatements = TransactionContextInitializer <TContext> .GenerateMigrationStatements((TransactionContext)context);

                DbMigrator dbMigrator = new DbMigrator(context.InternalContext.MigrationsConfiguration, (DbContext)context, DatabaseExistenceState.Exists, true);
                using (new TransactionScope(TransactionScopeOption.Suppress))
                    dbMigrator.ExecuteStatements(migrationStatements, connection.CurrentTransaction.StoreTransaction);
            }
        }
        public void InitializeDatabase(TContext context)
        {
            var entityConnection = (EntityConnection)((IObjectContextAdapter)context).ObjectContext.Connection;

            // We don't need to initialize the TransactionContext if there's no transaction yet
            if (entityConnection.State == ConnectionState.Open &&
                entityConnection.CurrentTransaction != null)
            {
                try
                {
                    using (new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        context.Transactions
                        .AsNoTracking()
                        .WithExecutionStrategy(new DefaultExecutionStrategy())
                        .Count();
                    }
                }
                catch (EntityException)
                {
                    var sqlStatements = GenerateMigrationStatements(context);
                    var migrator      = new DbMigrator(context.InternalContext.MigrationsConfiguration, context, DatabaseExistenceState.Exists, calledByCreateDatabase: true);
                    using (new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        migrator.ExecuteStatements(sqlStatements, entityConnection.CurrentTransaction.StoreTransaction);
                    }
                }
            }
        }
        public void InitializeDatabase(TContext context)
        {
            // We shouldn't create the database here as it might interfere with the parent context initialization.
            if (context.Database.Exists())
            {
                try
                {
                    using (new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        context.Transactions.AsNoTracking().Count();
                    }
                }
                catch (EntityException)
                {
                    var connection           = context.Database.Connection;
                    var emptyModel           = new DbModelBuilder().Build(connection).GetModel();
                    var createTableOperation = (CreateTableOperation)
                                               new EdmModelDiffer().Diff(emptyModel, context.GetModel()).Single();

                    var migrationsConfiguration = context.InternalContext.MigrationsConfiguration;
                    var migrationSqlGenerator   = migrationsConfiguration.GetSqlGenerator(context.InternalContext.ProviderName);

                    var providerManifestToken
                        = context.InternalContext.ModelProviderInfo != null
                            ? context.InternalContext.ModelProviderInfo.ProviderManifestToken
                            : DbConfiguration
                          .DependencyResolver
                          .GetService <IManifestTokenResolver>()
                          .ResolveManifestToken(connection);

                    var sqlStatements = migrationSqlGenerator.Generate(new[] { createTableOperation }, providerManifestToken);
                    var migrator      = new DbMigrator(migrationsConfiguration, context, DatabaseExistenceState.Exists);
                    using (new TransactionScope(TransactionScopeOption.Suppress))
                    {
                        migrator.ExecuteStatements(sqlStatements);
                    }
                }
            }
        }