Как применить изменения SubSonic 3 «SimpleRepository» в производственных системах - PullRequest
2 голосов
/ 26 октября 2009

Я играл с SimpleRepository от SubSonic, и это круто. Однако я хотел бы знать, есть ли простой способ применить ожидающие изменения в производственной системе.

Ранее я использовал «Миграции» в SubSonic 2 через командный файл; когда я был готов перейти к производству, я просто запустил все ожидающие миграции с рабочего сервера, и я был бы готов к работе. Красиво и просто.

SimpleRepostitory использует больше подходов "запускай их, когда они нужны" при переносе, но я не хочу оставлять эту опцию включенной, когда в работе.

Есть ли способ получить список ожидающих изменений? Я знаю, что мог бы использовать что-то вроде SqlDiff, но так как у меня раньше было рабочее решение, было бы стыдно его потерять ...

Любой

Ответы [ 2 ]

0 голосов
/ 12 марта 2010

Есть ли шанс, что вы можете упаковать это и поделиться им с проектом? :)

Я использовал гораздо более «бедное» решение для миграции, но оно не имеет отката или других функций.

0 голосов
/ 19 ноября 2009

Если вы используете отражатель , вы можете легко найти, как SimpleRepository управляет миграциями.

На самом деле я не пробовал этот код, но вы могли бы просто выполнить Миграции так же, как это делает SimpleRepository:

  • Создайте новый Migrator, передав его в сборке конструктору.
  • Создайте BatchQuery, если вы хотите использовать транзакции
  • Перебирайте типы, которые вы хотите перенести, получая строку SQL, вызывая метод MigrateFromModel для объекта переноса
  • если вы хотите использовать BatchQuery, создайте новый QueryCommand и передайте объект методу QueueForTransaction в BatchQuery.

Вот метод в Reflector: (следуя логике того, как MigrateFromModel выясняет, что нужно изменить, оставляем в качестве упражнения для читателя :))

private void Migrate<T>() where T: class, new()
{
    Type item = typeof(T);
    if (!this.migrated.Contains(item))
    {
        BatchQuery query = new BatchQuery(this._provider);
        Migrator migrator = new Migrator(Assembly.GetExecutingAssembly());
        foreach (string str in migrator.MigrateFromModel(item, this._provider))
        {
            query.QueueForTransaction(new QueryCommand(str, this._provider));
        }
        query.ExecuteTransaction();
        this.migrated.Add(item);
    }
}
...