public void AddDbModelChanges(DbUpgradeInfo upgradeInfo, MemoryLog log) { _upgradeInfo = upgradeInfo; _newModel = upgradeInfo.NewDbModel; _oldModel = upgradeInfo.OldDbModel; _log = log; _options = _upgradeInfo.Settings.UpgradeOptions; var driver = _newModel.Driver; _useRefIntegrity = driver.Supports(DbFeatures.ReferentialConstraints) && _newModel.Config.Options.IsSet(DbOptions.UseRefIntegrity) ; _compareTables = _options.IsSet(DbUpgradeOptions.UpdateTables); _compareIndexes = _options.IsSet(DbUpgradeOptions.UpdateIndexes); _compareViews = driver.Supports(DbFeatures.Views) && _options.IsSet(DbUpgradeOptions.UpdateViews); var usesStoredProcs = driver.Supports(DbFeatures.StoredProcedures) && _newModel.Config.Options.IsSet(DbOptions.UseStoredProcs); _compareStoredProcs = usesStoredProcs && _options.IsSet(DbUpgradeOptions.UpdateStoredProcs); _dropUnknown = _options.IsSet(DbUpgradeOptions.DropUnknownObjects); _supportsSchemas = driver.Supports(DbFeatures.Schemas); _supportsOrderInIndexes = driver.Supports(DbFeatures.OrderedColumnsInIndexes); // Nullify all obj.Peer fields to make sure we drop references to old model - mostly convenience in debugging // to allow multiple entry into this method in debugger _oldModel.ResetPeerRefs(); MatchObjectsWithPeers(); //new stuff BuildChangeList(); // Do not do it here, refs to old objects might be need by Sql generators; we will reset refs after completing update // _newModel.ResetPeerRefs() }
public void BuildDbModelChanges(DbUpgradeInfo upgradeInfo, IDbObjectComparer comparer, ILog log) { _upgradeInfo = upgradeInfo; _comparer = comparer; _log = log; _newModel = upgradeInfo.NewDbModel; _oldModel = upgradeInfo.OldDbModel; _options = _upgradeInfo.Settings.UpgradeOptions; var driver = _newModel.Driver; _useRefIntegrity = driver.Supports(DbFeatures.ReferentialConstraints) && _newModel.Config.Options.IsSet(DbOptions.UseRefIntegrity); _compareTables = _options.IsSet(DbUpgradeOptions.UpdateTables); _compareIndexes = _options.IsSet(DbUpgradeOptions.UpdateIndexes); _compareViews = driver.Supports(DbFeatures.Views) && _options.IsSet(DbUpgradeOptions.UpdateViews); _dropUnknown = _options.IsSet(DbUpgradeOptions.DropUnknownObjects); _supportsSchemas = driver.Supports(DbFeatures.Schemas); // Nullify all obj.Peer fields to make sure we drop references to old model - mostly convenience in debugging // to allow multiple entry into this method in debugger _oldModel.ResetPeerRefs(); MatchObjectsWithPeers(); //new stuff BuildChangeList(); // Do not do it here, refs to old objects might be need by Sql generators; we will reset refs after completing update // _newModel.ResetPeerRefs() }//class
/// <summary> /// Performs Db model update actions, depending on instance type (dev, staging, production). /// </summary> public DbUpgradeInfo BuildUpgradeInfo() { //Even if we do not do db model upgrades, we still may have migration actions (post upgrate), which we will run after completing connection to db var driver = _database.DbModel.Driver; _upgradeInfo = new DbUpgradeInfo(_database.Settings, _database.DbModel); var oldDbVersion = LoadDbVersionInfo(); if (!CheckCanUpgrade(oldDbVersion)) { return(_upgradeInfo); } var loader = driver.CreateDbModelLoader(_database.Settings, _log); if (driver.Supports(DbFeatures.Schemas)) { var schemas = _database.DbModel.Schemas.Select(s => s.Schema).ToList(); loader.SetSchemasSubset(schemas); } _upgradeInfo.OldDbModel = loader.LoadModel(); _upgradeInfo.OldDbModel.VersionInfo = oldDbVersion; //assign prior versions //Compare two models and get changes var modelComparer = new DbModelComparer(); modelComparer.BuildDbModelChanges(_upgradeInfo, loader as IDbObjectComparer, _log); //build scripts var updater = driver.CreateDbModelUpdater(_database.Settings); updater.BuildScripts(_upgradeInfo); //Add migrations var migrSet = new DbMigrationSet(_app, _database, _upgradeInfo.OldDbModel); foreach (var module in this._database.DbModel.EntityApp.Modules) { migrSet.CurrentModule = module; module.RegisterMigrations(migrSet); } migrSet.CurrentModule = null; _upgradeInfo.AddMigrations(migrSet); //Update final status _upgradeInfo.VersionsChanged = oldDbVersion != null && _database.DbModel.VersionInfo.VersionChanged(oldDbVersion); if (_upgradeInfo.AllScripts.Count > 0 || _upgradeInfo.VersionsChanged) { _upgradeInfo.Status = UpgradeStatus.ChangesDetected; } else { _upgradeInfo.Status = UpgradeStatus.NoChanges; } //Sort, Clear up _upgradeInfo.AllScripts.Sort(DbUpgradeScript.CompareExecutionOrder); _database.DbModel.ResetPeerRefs(); //drop refs to old model return(_upgradeInfo); }
public static bool EntitiesChanging(this DbUpgradeInfo changeSet, params Type[] entities) { foreach (var tg in changeSet.TableChanges) { if (tg.NewTable == null) { continue; } if (entities.Contains(tg.NewTable.Entity.EntityType)) { return(true); } } return(false); }
public DbUpgradeInfo UpgradeDatabase() { //Check db version vs app version _upgradeInfo = BuildUpgradeInfo(); try { if (_upgradeInfo.Status == UpgradeStatus.ChangesDetected) { ApplyUpgrades(); _upgradeInfo.Status = UpgradeStatus.Applied; } SaveDbVersionInfo(); } catch (Exception ex) { SaveDbVersionInfo(ex); throw; } return(_upgradeInfo); }
/// <summary> /// Performs Db model update actions, depending on instance type (dev, staging, production). /// </summary> public DbUpgradeInfo BuildUpgradeInfo() { //Even if we do not do db model upgrades, we still may have migration actions (post upgrate), which we will run after completing connection to db var driver = _database.DbModel.Driver; var loader = driver.CreateDbModelLoader(_database.Settings, _log); _upgradeInfo = new DbUpgradeInfo(_database.Settings, _database.DbModel); var oldDbVersion = LoadDbVersionInfo(loader); if (!CheckCanUpgrade(oldDbVersion)) return _upgradeInfo; _upgradeInfo.OldDbModel = loader.LoadModel(); _upgradeInfo.OldDbModel.VersionInfo = oldDbVersion; //assign prior versions //Compare two models and get changes var modelComparer = new DbModelComparer(); modelComparer.AddDbModelChanges(_upgradeInfo, _log); //build scripts var updater = driver.CreateDbModelUpdater(_database.Settings); updater.BuildScripts(_upgradeInfo); //Add migrations var migrSet = new DbMigrationSet(_app, _database, _upgradeInfo.OldDbModel); foreach (var module in this._database.DbModel.EntityApp.Modules) { migrSet.CurrentModule = module; module.RegisterMigrations(migrSet); } migrSet.CurrentModule = null; _upgradeInfo.AddMigrations(migrSet); //Update final status _upgradeInfo.VersionsChanged = _database.DbModel.VersionInfo.VersionChanged(oldDbVersion); if (_upgradeInfo.AllScripts.Count > 0 || _upgradeInfo.VersionsChanged) _upgradeInfo.Status = UpgradeStatus.ChangesDetected; else _upgradeInfo.Status = UpgradeStatus.NoChanges; //Sort, Clear up _upgradeInfo.AllScripts.Sort(DbUpgradeScript.CompareExecutionOrder); _database.DbModel.ResetPeerRefs(); //drop refs to old model return _upgradeInfo; }
public DbUpgradeInfo UpgradeDatabase() { //Check db version vs app version _upgradeInfo = BuildUpgradeInfo(); if(_upgradeInfo.Status != UpgradeStatus.ChangesDetected) return _upgradeInfo; ApplyUpgrades(); _upgradeInfo.Status = UpgradeStatus.Applied; //TODO: review this and refactor var actLogFile = _database.DbModel.EntityApp.ActivationLogPath; if (!string.IsNullOrEmpty(actLogFile)) _log.DumpTo(actLogFile); return _upgradeInfo; }
public virtual void BuildScripts(DbUpgradeInfo upgradeInfo) { var allChanges = new List<DbObjectChange>(upgradeInfo.NonTableChanges); allChanges.AddRange(upgradeInfo.TableChanges.SelectMany(tc => tc.Changes)); foreach(var change in allChanges) { BuildScripts(change); upgradeInfo.AllScripts.AddRange(change.Scripts); } if (Test_RandomizeInitialSchemaUpdatesOrder) RandomHelper.RandomizeListOrder(upgradeInfo.AllScripts); }
public override void BuildScripts(DbUpgradeInfo upgradeInfo) { base.BuildScripts(upgradeInfo); }
private void ApplyMigrations(DbUpgradeInfo upgradeInfo) { if (upgradeInfo.PostUpgradeMigrations == null || upgradeInfo.PostUpgradeMigrations.Count == 0) return; var session = _app.OpenSystemSession(); foreach (var m in upgradeInfo.PostUpgradeMigrations) { m.Action(session); } session.SaveChanges(); }