public virtual void BootstrapUsingEFProviderDdl(XDocument model)
        {
            DebugCheck.NotNull(model);

            DbConnection connection = null;

            try
            {
                connection = CreateConnection();

                using (var context = CreateContext(connection))
                {
                    context.Database.ExecuteSqlCommand(
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript());

                    context.History.Add(
                        new HistoryRow
                    {
                        MigrationId = MigrationAssembly
                                      .CreateMigrationId(Strings.InitialCreate)
                                      .RestrictTo(_migrationIdMaxLength),
                        ContextKey     = _contextKey,
                        Model          = new ModelCompressor().Compress(model),
                        ProductVersion = _productVersion
                    });

                    context.SaveChanges();
                }
            }
            finally
            {
                DisposeConnection(connection);
            }
        }
Esempio n. 2
0
        public virtual void BootstrapUsingEFProviderDdl(VersionedModel versionedModel)
        {
            DbConnection connection = (DbConnection)null;

            try
            {
                connection = this.CreateConnection();
                using (HistoryContext context = this.CreateContext(connection, (string)null))
                {
                    context.Database.ExecuteSqlCommand(((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript());
                    context.History.Add(new HistoryRow()
                    {
                        MigrationId    = MigrationAssembly.CreateMigrationId(Strings.InitialCreate).RestrictTo(this._migrationIdMaxLength),
                        ContextKey     = this._contextKey,
                        Model          = new ModelCompressor().Compress(versionedModel.Model),
                        ProductVersion = versionedModel.Version ?? HistoryRepository._productVersion
                    });
                    context.SaveChanges();
                }
            }
            finally
            {
                this.DisposeConnection(connection);
            }
        }
Esempio n. 3
0
        internal override void Upgrade(
            IEnumerable <string> pendingMigrations, string targetMigrationId, string lastMigrationId)
        {
            DbMigration lastMigration = null;

            if (lastMigrationId != null)
            {
                lastMigration = _migrationAssembly.GetMigration(lastMigrationId);
            }

            foreach (var pendingMigration in pendingMigrations)
            {
                var migration = _migrationAssembly.GetMigration(pendingMigration);

                base.ApplyMigration(migration, lastMigration);

                lastMigration = migration;

                _emptyMigrationNeeded = false;

                if (pendingMigration.EqualsIgnoreCase(targetMigrationId))
                {
                    break;
                }
            }

            if (string.IsNullOrWhiteSpace(targetMigrationId) &&
                ((_emptyMigrationNeeded && _configuration.AutomaticMigrationsEnabled) ||
                 IsModelOutOfDate(_currentModel, lastMigration)))
            {
                if (!_configuration.AutomaticMigrationsEnabled)
                {
                    throw Error.AutomaticDisabledException();
                }

                base.AutoMigrate(
                    MigrationAssembly.CreateMigrationId(
                        _calledByCreateDatabase
                            ? Strings.InitialCreate
                            : Strings.AutomaticMigration),
                    _calledByCreateDatabase
                        ? _emptyModel.Value
                        : GetLastModel(lastMigration),
                    _currentModel,
                    false);
            }

            // Context may not be constructable when Migrations is being called by DbContext CreateDatabase
            // and the config cannot have Seed data anyway, so avoid doing model diff and creating the context to seed.
            if (!_calledByCreateDatabase && !IsModelOutOfDate(_currentModel, lastMigration))
            {
                base.SeedDatabase();
            }
        }
Esempio n. 4
0
        internal override void Upgrade(
            IEnumerable <string> pendingMigrations, string targetMigrationId, string lastMigrationId)
        {
            DbMigration lastMigration = null;

            if (lastMigrationId != null)
            {
                lastMigration = _migrationAssembly.GetMigration(lastMigrationId);
            }

            foreach (var pendingMigration in pendingMigrations)
            {
                var migration = _migrationAssembly.GetMigration(pendingMigration);

                base.ApplyMigration(migration, lastMigration);

                lastMigration = migration;

                _emptyMigrationNeeded = false;

                if (pendingMigration.EqualsIgnoreCase(targetMigrationId))
                {
                    break;
                }
            }

            if (string.IsNullOrWhiteSpace(targetMigrationId) &&
                ((_emptyMigrationNeeded && _configuration.AutomaticMigrationsEnabled) ||
                 IsModelOutOfDate(_currentModel, lastMigration)))
            {
                if (!_configuration.AutomaticMigrationsEnabled)
                {
                    throw Error.AutomaticDisabledException();
                }

                base.AutoMigrate(
                    MigrationAssembly.CreateMigrationId(
                        _calledByCreateDatabase
                            ? Strings.InitialCreate
                            : Strings.AutomaticMigration),
                    _calledByCreateDatabase
                        ? _emptyModel.Value
                        : GetLastModel(lastMigration),
                    _currentModel,
                    false);
            }

            if (!IsModelOutOfDate(_currentModel, lastMigration))
            {
                base.SeedDatabase();
            }
        }
Esempio n. 5
0
        internal ScaffoldedMigration Scaffold(string migrationName, string @namespace, bool ignoreChanges)
        {
            XDocument sourceModel = null;

            CheckLegacyCompatibility(() => sourceModel = _currentModel);

            string sourceMigrationId = null;

            sourceModel = sourceModel ?? (_historyRepository.GetLastModel(out sourceMigrationId) ?? _emptyModel.Value);
            var modelCompressor = new ModelCompressor();

            var migrationOperations
                = ignoreChanges
                      ? Enumerable.Empty <MigrationOperation>()
                      : _modelDiffer.Diff(sourceModel, _currentModel, false)
                  .ToList();

            string migrationId;

            if (migrationName.IsValidMigrationId())
            {
                migrationId   = migrationName;
                migrationName = migrationName.MigrationName();
            }
            else
            {
                migrationName = _migrationAssembly.UniquifyName(migrationName);
                migrationId   = MigrationAssembly.CreateMigrationId(migrationName);
            }

            var generatedMigration
                = _configuration.CodeGenerator.Generate(
                      migrationId,
                      migrationOperations,
                      (sourceModel == _emptyModel.Value) ||
                      (sourceModel == _currentModel) ||
                      !sourceMigrationId.IsAutomaticMigration()
                        ? null
                        : Convert.ToBase64String(modelCompressor.Compress(sourceModel)),
                      Convert.ToBase64String(modelCompressor.Compress(_currentModel)),
                      @namespace,
                      migrationName);

            generatedMigration.MigrationId = migrationId;
            generatedMigration.Directory   = _configuration.MigrationsDirectory;

            return(generatedMigration);
        }
Esempio n. 6
0
        internal ScaffoldedMigration Scaffold(
            string migrationName,
            string @namespace,
            bool ignoreChanges)
        {
            string        migrationId1 = (string)null;
            bool          flag         = false;
            List <string> list         = this.GetPendingMigrations().ToList <string>();

            if (list.Any <string>())
            {
                string str = list.Last <string>();
                if (!str.EqualsIgnoreCase(migrationName) && !str.MigrationName().EqualsIgnoreCase(migrationName))
                {
                    throw Error.MigrationsPendingException((object)list.Join <string>((Func <string, string>)null, ", "));
                }
                flag          = true;
                migrationId1  = str;
                migrationName = str.MigrationName();
            }
            XDocument sourceModel = (XDocument)null;

            this.CheckLegacyCompatibility((Action)(() => sourceModel = this._currentModel));
            string migrationId2   = (string)null;
            string productVersion = (string)null;

            sourceModel = sourceModel ?? this._historyRepository.GetLastModel(out migrationId2, out productVersion, (string)null) ?? this._emptyModel.Value;
            IEnumerable <MigrationOperation> operations = ignoreChanges ? Enumerable.Empty <MigrationOperation>() : (IEnumerable <MigrationOperation>) this._modelDiffer.Diff(sourceModel, this._currentModel, this._modificationCommandTreeGenerator, this.SqlGenerator, productVersion, (string)null).ToList <MigrationOperation>();

            if (!flag)
            {
                migrationName = this._migrationAssembly.UniquifyName(migrationName);
                migrationId1  = MigrationAssembly.CreateMigrationId(migrationName);
            }
            ModelCompressor     modelCompressor     = new ModelCompressor();
            ScaffoldedMigration scaffoldedMigration = this._configuration.CodeGenerator.Generate(migrationId1, operations, sourceModel == this._emptyModel.Value || sourceModel == this._currentModel || !migrationId2.IsAutomaticMigration() ? (string)null : Convert.ToBase64String(modelCompressor.Compress(sourceModel)), Convert.ToBase64String(modelCompressor.Compress(this._currentModel)), @namespace, migrationName);

            scaffoldedMigration.MigrationId  = migrationId1;
            scaffoldedMigration.Directory    = this._configuration.MigrationsDirectory;
            scaffoldedMigration.IsRescaffold = flag;
            scaffoldedMigration.Resources.Add("DefaultSchema", (object)this._defaultSchema);
            return(scaffoldedMigration);
        }
Esempio n. 7
0
        public virtual void BootstrapUsingEFProviderDdl(XDocument model)
        {
            DebugCheck.NotNull(model);

            using (var context = CreateContext())
            {
                context.Database.ExecuteSqlCommand(
                    ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript());

                context.History.Add(
                    new HistoryRow
                {
                    MigrationId    = MigrationAssembly.CreateMigrationId(Strings.InitialCreate),
                    ContextKey     = _contextKey,
                    Model          = new ModelCompressor().Compress(model),
                    ProductVersion = Assembly.GetExecutingAssembly().GetInformationalVersion()
                });

                context.SaveChanges();
            }
        }
Esempio n. 8
0
        internal override void Upgrade(
            IEnumerable <string> pendingMigrations,
            string targetMigrationId,
            string lastMigrationId)
        {
            DbMigration lastMigration = (DbMigration)null;

            if (lastMigrationId != null)
            {
                lastMigration = this._migrationAssembly.GetMigration(lastMigrationId);
            }
            foreach (string pendingMigration in pendingMigrations)
            {
                DbMigration migration = this._migrationAssembly.GetMigration(pendingMigration);
                base.ApplyMigration(migration, lastMigration);
                lastMigration = migration;
                this._emptyMigrationNeeded = false;
                if (pendingMigration.EqualsIgnoreCase(targetMigrationId))
                {
                    break;
                }
            }
            if (string.IsNullOrWhiteSpace(targetMigrationId) && (this._emptyMigrationNeeded && this._configuration.AutomaticMigrationsEnabled || this.IsModelOutOfDate(this._currentModel, lastMigration)))
            {
                if (!this._configuration.AutomaticMigrationsEnabled)
                {
                    throw Error.AutomaticDisabledException();
                }
                base.AutoMigrate(MigrationAssembly.CreateMigrationId(this._calledByCreateDatabase ? Strings.InitialCreate : Strings.AutomaticMigration), this._calledByCreateDatabase ? new VersionedModel(this._emptyModel.Value, (string)null) : this.GetLastModel(lastMigration, (string)null), new VersionedModel(this._currentModel, (string)null), false);
            }
            if (this._calledByCreateDatabase || this.IsModelOutOfDate(this._currentModel, lastMigration))
            {
                return;
            }
            base.SeedDatabase();
        }
        public void Update_blocks_automatic_migration_when_explicit_source_model()
        {
            ResetDatabase();

            var migrator = CreateMigrator <ShopContext_v1>();

            migrator.Update();

            migrator = CreateMigrator <ShopContext_v2>(automaticDataLossEnabled: true);

            migrator.Update();

            var generatedMigration = new MigrationScaffolder(migrator.Configuration).Scaffold("Migration1");

            ResetDatabase();

            migrator = CreateMigrator <ShopContext_v1>();

            migrator.Update();

            // Fix-up migrationId to come after previous automatic migration
            var oldMigrationId = generatedMigration.MigrationId;
            var newMigrationId = MigrationAssembly.CreateMigrationId(oldMigrationId.MigrationName());

            generatedMigration.MigrationId  = newMigrationId;
            generatedMigration.DesignerCode = generatedMigration.DesignerCode.Replace(oldMigrationId, newMigrationId);

            migrator
                = CreateMigrator <ShopContext_v2>(
                      automaticMigrationsEnabled: false,
                      automaticDataLossEnabled: false,
                      scaffoldedMigrations: generatedMigration);

            Assert.Throws <AutomaticDataLossException>(() => migrator.Update())
            .ValidateMessage("AutomaticDataLoss");
        }
Esempio n. 10
0
        internal ScaffoldedMigration Scaffold(string migrationName, string @namespace, bool ignoreChanges)
        {
            string migrationId   = null;
            var    rescaffolding = false;

            var pendingMigrations = GetPendingMigrations().ToList();

            if (pendingMigrations.Any())
            {
                var lastMigration = pendingMigrations.Last();

                if (!lastMigration.EqualsIgnoreCase(migrationName) &&
                    !lastMigration.MigrationName().EqualsIgnoreCase(migrationName))
                {
                    throw Error.MigrationsPendingException(pendingMigrations.Join());
                }

                rescaffolding = true;
                migrationId   = lastMigration;
                migrationName = lastMigration.MigrationName();
            }

            XDocument sourceModel = null;

            CheckLegacyCompatibility(() => sourceModel = _currentModel);

            string sourceMigrationId = null;

            sourceModel = sourceModel ?? (_historyRepository.GetLastModel(out sourceMigrationId) ?? _emptyModel.Value);
            var modelCompressor = new ModelCompressor();

            var migrationOperations
                = ignoreChanges
                      ? Enumerable.Empty <MigrationOperation>()
                      : _modelDiffer.Diff(sourceModel, _currentModel, _modificationCommandTreeGenerator, SqlGenerator)
                  .ToList();

            if (!rescaffolding)
            {
                migrationName = _migrationAssembly.UniquifyName(migrationName);
                migrationId   = MigrationAssembly.CreateMigrationId(migrationName);
            }

            var scaffoldedMigration
                = _configuration.CodeGenerator.Generate(
                      migrationId,
                      migrationOperations,
                      (sourceModel == _emptyModel.Value) ||
                      (sourceModel == _currentModel) ||
                      !sourceMigrationId.IsAutomaticMigration()
                        ? null
                        : Convert.ToBase64String(modelCompressor.Compress(sourceModel)),
                      Convert.ToBase64String(modelCompressor.Compress(_currentModel)),
                      @namespace,
                      migrationName);

            scaffoldedMigration.MigrationId  = migrationId;
            scaffoldedMigration.Directory    = _configuration.MigrationsDirectory;
            scaffoldedMigration.IsRescaffold = rescaffolding;
            scaffoldedMigration.Resources.Add(DefaultSchemaResourceKey, _defaultSchema);

            return(scaffoldedMigration);
        }