2010-03-02 1 views
1

Фон - мне нужен фреймворк/подход к управляемым обновлениям базы данных для приложения .NET Winforms, развернутого на ПК пользователей с помощью Clickonce deploy , Приложение использует базу данных sqlite.как я могу вызвать/использовать Subsonic из приложения WinForms, развернутого через clickonce (с Sqlite DB)

Q1. Какой механизм использует Subsonic для выполнения таких миграций на локальном ПК? например это будет MSBuild

Q2. Если ему нужен инструмент, например, как мое приложение может эффективно запускать MsBuild? например, как он может быть уверен в том, какой путь он установлен, а что, если он не установлен, должен ли я включать MSBuild.exe в пакет clickonce, чтобы я знал, что он там точно уверен?

Q3. Любые другие предложения о том, как использовать Subsonic в этом конкретном случае использования?

Q4. Любые комментарии о том, будет ли MigratorDotNet лучше подходит? (если у кого-то был опыт работы с обоими)

Q5. Могу ли я использовать базовую инфраструктуру переноса subsonic и просто иметь набор файлов SQL для обновления/понижения? например, просто использовать фреймворк для проверки версии базы данных и сценариев для запуска и т. д.?

ответ

1

Ну, пост немного старый, но, возможно, мои ответы по-прежнему используются.

Q1: SubSonic Migrations - это файлы кода, которые выполняются и выполняются во время выполнения подкомандом (sonic.exe), что означает, что файлы кода должны быть на диске и должны следовать соглашению об именах 001_migration_name.cs для подкоманда, чтобы знать выполнение заказ.

Q2: Для миграции не требуется msbuild. Единственное, что вам нужно, это sonic.exe и его зависимости.

Q3: Возможно (и не очень сложно) создать свой собственный логик для выполнения миграций в вашем проекте во время выполнения без использования подкоманды.

В основном я нахожу каждый класс, полученный из Migration, и (поскольку класс не может начинаться с числа) мое соглашение состоит в том, что последние 3 цифры из имени класса являются номером миграции (например, 001_migration_name.cs мои классы определяется как Migration001: Migration)

public class MigrationHelper 
{ 
    private const string providerName = "MyProviderName"; 
    public static int CurrentVersion { get { return SubSonic.Migrations.Migrator.GetCurrentVersion(providerName); } } 

    private static Dictionary<int, Migration> _migrations; 
    public static Dictionary<int, Migration> Migrations 
    { 
     get 
     { 

      if (_migrations == null) 
      { 
       _migrations = new Dictionary<int, Migration>(); 
       foreach (Type t in new MigrationHelper().GetType().Assembly.GetExportedTypes()) 
       { 
        if (t.BaseType == typeof(SubSonic.Migration)) 
        { 
         int number; 
         if (int.TryParse(t.Name.Substring(t.Name.Length - 3, 3), out number)) 
          Migrations.Add(number, (Migration)Activator.CreateInstance(t)); 
         else 
          throw new InvalidOperationException("Classes that inherit SubSonic Migrations have to be named MigrationXXX where x is the unique migration number"); 
        } 
       } 
      } 
      return _migrations; 

     } 
    } 

    public static void ExecuteMigration(Migration m, Migration.MigrationDirection direction) 
    { 
     m.Migrate(providerName, direction); 
    } 


} 

в вашей программе вы можете определить текущую версию по MigrationHelper.CurrentVersion, а затем выполнить каждый переход от тока макс (если вы WANNE идти вверх) или какой-либо другой номер. Вот как вы его используете.

 Migration m = MigrationHelper.Migrations[15]; 
     MigrationHelper.ExecuteMigration(m, Migration.MigrationDirection.Up); 

Q4: У меня нет опыта работы с MigratorDotNet, но если ваше приложение использует дозвуковое, чем дозвуковые миграции являются хорошим выбором, так как вам не нужно, чтобы развернуть дополнительную LIBS.

Q5: Вы можете использовать дозвуковые миграции для этого. Просто выполните:

Execute("CREATE TABLE ..."); 

в методе Up() или Down(). Но преимущество использования предопределенных методов (помимо того, что они работают через несколько dbms, которые могут быть не столь важными, если вы используете только sqlite), заключается в том, что у вас есть предварительные проверки (например, миграция не удастся, если вы определите поле дважды до того, как будет выполнен фактический sql)