static SqlPreCommand Schema_Synchronizing(Replacements replacements)
        {
            Table table = Schema.Current.Table <T>();

            List <T>        current = AvoidCache().Using(_ => Administrator.TryRetrieveAll <T>(replacements));
            IEnumerable <T> should  = getSymbols();

            using (replacements.WithReplacedDatabaseName())
                return(Synchronizer.SynchronizeScriptReplacing(replacements, typeof(T).Name,
                                                               should.ToDictionary(s => s.Key),
                                                               current.ToDictionary(c => c.Key),
                                                               (k, s) => table.InsertSqlSync(s),
                                                               (k, c) => table.DeleteSqlSync(c),
                                                               (k, s, c) =>
                {
                    var originalName = c.Key;
                    c.Key = s.Key;
                    return table.UpdateSqlSync(c, comment: originalName);
                }, Spacing.Double));
        }
        static SqlPreCommand SynchronizeEnumsScript(Replacements replacements)
        {
            Schema schema = Schema.Current;

            List <SqlPreCommand> commands = new List <SqlPreCommand>();

            foreach (var table in schema.Tables.Values)
            {
                Type enumType = EnumEntity.Extract(table.Type);
                if (enumType != null)
                {
                    IEnumerable <Entity>        should       = EnumEntity.GetEntities(enumType);
                    Dictionary <string, Entity> shouldByName = should.ToDictionary(a => a.ToString());

                    List <Entity> current = Administrator.TryRetrieveAll(table.Type, replacements);
                    Dictionary <string, Entity> currentByName = current.ToDictionaryEx(a => a.toStr, table.Name.Name);

                    string key = Replacements.KeyEnumsForTable(table.Name.Name);

                    replacements.AskForReplacements(currentByName.Keys.ToHashSet(), shouldByName.Keys.ToHashSet(), key);

                    currentByName = replacements.ApplyReplacementsToOld(currentByName, key);

                    var mix = shouldByName.JoinDictionary(currentByName, (n, s, c) => new { s, c }).Where(a => a.Value.s.id != a.Value.c.id).ToDictionary();

                    HashSet <PrimaryKey> usedIds = current.Select(a => a.Id).ToHashSet();

                    Dictionary <string, Entity> middleByName = mix.Where(kvp => usedIds.Contains(kvp.Value.s.Id)).ToDictionary(kvp => kvp.Key, kvp => Clone(kvp.Value.c));

                    if (middleByName.Any())
                    {
                        var moveToAux = SyncEnums(schema, table,
                                                  currentByName.Where(a => middleByName.ContainsKey(a.Key)).ToDictionary(),
                                                  middleByName);
                        if (moveToAux != null)
                        {
                            commands.Add(moveToAux);
                        }
                    }

                    var com = SyncEnums(schema, table,
                                        currentByName.Where(a => !middleByName.ContainsKey(a.Key)).ToDictionary(),
                                        shouldByName.Where(a => !middleByName.ContainsKey(a.Key)).ToDictionary());
                    if (com != null)
                    {
                        commands.Add(com);
                    }

                    if (middleByName.Any())
                    {
                        var backFromAux = SyncEnums(schema, table,
                                                    middleByName,
                                                    shouldByName.Where(a => middleByName.ContainsKey(a.Key)).ToDictionary());
                        if (backFromAux != null)
                        {
                            commands.Add(backFromAux);
                        }
                    }
                }
            }

            return(SqlPreCommand.Combine(Spacing.Double, commands.ToArray()));
        }