2010-03-02 63 views
1

背景 - 我需要一个框架/方法来管理数据库更新.NET .NET Winforms应用程序部署在用户PC通过clickonce部署。该应用程序使用sqlite数据库。我将如何调用/使用Subsonic从一个WinForms应用程序部署在clickonce(与Sqlite数据库)

Q1。 Subsonic使用什么机制在本地PC上运行此类迁移?例如它会是MSBuild

Q2。如果它确实需要一个工具,比如我的应用程序如何强力启动MsBuild?即如何确定它的安装路径,如果未安装它,应该在clickonce软件包中包含MSBuild.exe,以便我知道它确实存在于我自己?

Q3。有关如何在这个特定用例中使用Subsonic的其他建议?

Q4。关于MigratorDotNet是否会更好的评论? (如果有人有两种经验)

Q5。我可以使用亚音速的裸机迁移框架,只需要一组SQL文件来执行升级/降级操作?即只是使用框架来检查数据库版本和运行哪些脚本等?

回答

1

那么,这个帖子有点老了,但也许我的答案仍然有用。

Q1:SubSonic Migrations是由子指令(sonic.exe)在运行时编译和执行的代码文件,这意味着代码文件必须位于磁盘上并且必须遵循命名约定001_migration_name.cs,以便子指令员知道执行订购。

Q2:你不需要msbuild进行迁移。你需要的唯一东西是sonic.exe和它的依赖关系。

问题3:创建自己的logik可以(并不是很难)在运行时执行项目中的迁移,而无需使用子命令。

我基本上找到每一个派生自迁移的类,(因为一个类不能以数字开头),我的约定是类名的最后3位数是迁移编号(就像001_migration_name.cs,我的类是定义为Migration001:迁移)

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经验,但如果你的应用程序使用亚音速比亚音速的迁移是一个很好的choise,因为你不需要部署任何额外的库。

问题5:您可以使用亚音速迁移。只需要:

Execute("CREATE TABLE ..."); 

在Up()或Down()方法中。但是使用预定义方法的优点是(除了它们跨越多个dbms工作的事实,如果你只使用sqlite,这个工作并不重要),就是你有一些预先飞行检查(例如,如果你定义了一个迁移将会失败字段执行实际的sql之前两次)

相关问题