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); } }
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); } }
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(); } }
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(); } }
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); }
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); }
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(); } }
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"); }
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); }