コード例 #1
0
        public MigrationGenerator(NHibernate.Cfg.Configuration configuration, Encoding encoding)
        {
            this.Encoding = encoding;
            Configuration = configuration;
            Configuration.BuildMappings(); // necessary to complete columns creation (foreign keys...)

            var mapping = Configuration.CreateMappings(new GenericDialect());
            // extract the tables scheme
            CurrentScheme = new MigrationScheme(mapping.IterateTables.Select(t => new MigrationTable(t)));
            UpdateForeignKeys();

            PreviousSnapshotFileName = string.Format("{0}\\previous.snapshot",Directory.GetCurrentDirectory());

        }
コード例 #2
0
       public  IEnumerable<Migration> CompareScheme(MigrationScheme previous, MigrationScheme current)
        {
            // detect new tables
            foreach (var table in current.Tables)
            {
                if (!previous.HasTable(table.Name))
                {
                    yield return new CreateTableMigration(table);
                }
                else // table still exists
                { 
                    var previous_table = previous[table.Name];

                    foreach (var column in table.Columns)
                    {
                        var previous_column = previous_table.Columns.FirstOrDefault(c => c.Name == column.Name);
                        if (previous_column == null) //detect new columns
                        {
                            yield return new CreateColumnMigration(column);
                        }
                        else
                        { 
                            // column alteration
                            if (!previous_column.IsSimilarTo(column))
                                yield return new AlterColumnMigration(previous_column, column);
                        }
                    }

                    // delect deleted columns
                    foreach (var previous_column in previous_table.Columns)
                    {
                        var column = table.Columns.FirstOrDefault(c => c.Name == previous_column.Name);
                        if (column == null)
                        { // column was deleted 
                            yield return new DeleteColumnMigration(previous_column);
                        }
                    }
                }
            }

            // detect droped tables
            foreach (var table in previous.Tables)
            {
                if (!current.HasTable(table.Name))
                {
                    yield return new DropTableMigration(table);
                }
            }
        }