Beispiel #1
0
        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
Beispiel #3
0
        /// <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);
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
 /// <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;
 }
Beispiel #7
0
 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;
 }
Beispiel #8
0
 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);
 }
Beispiel #9
0
 public override void BuildScripts(DbUpgradeInfo upgradeInfo)
 {
     base.BuildScripts(upgradeInfo);
 }
Beispiel #10
0
 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(); 
 }