可以自动更新数据库架构的O / R映射器?

时间:2008-12-16 15:38:01

标签: .net orm

是否有任何O / R映射器会在您更新业务对象时自动创建或修改数据库架构?在环顾四周之后,似乎大多数库通过从数据库模式创建业务对象而以另一种方式工作。

我希望拥有这种能力的原因是我正在计划一种产品,将其数据存储在客户机器上的数据库中。所以我可能必须在新版本发布时更新数据库架构。

另一个要求是映射器支持基于文件的数据库,如SQLite或JET,而不仅仅是SQL服务器。

我知道Developer Express的XPO具有这种能力,但我想知道是否有其他选择。

由于

3 个答案:

答案 0 :(得分:2)

NHibernate可以为您生成业务对象的数据库架构。

答案 1 :(得分:1)

SubSonic做你需要的。它有一个与声音指挥官一起使用的迁移类。我修改了代码并将其放入我的应用程序的启动中,并让它检查版本差异并自动升级。 这就是你需要设置它的方法:

  1. 您需要添加版本化的迁移类。如果您以前从未使用过SubSonic,可能需要查看此tutorial。以下类保存为\ Migrations \ 001_initial.cs,如果从subsonic调用migrate.exe(在VS内),它会将当前db更新为可用的最新版本。您需要保留3位版本前缀作为migrate.exe的文件名才能正常工作,如教程中所述。对于类名,我自己编写的迁移类需要使用下划线和3位数版本前缀来正确检测版本。
  2. // *不确定为什么我需要这一行来使代码块在

    下面工作
    namespace MyApps.Migrations
    {
        public class _001_Initial : Migration
        {
            public override void Up()
            {
                //Execute your upgrade query here
            }
            public override void Down()
            {
                //Execute your downgrade query here
            }
        }
    }
    
    1. 在应用程序启动期间调用CheckForMigration()。 IsUpdateAvailable将指示您需要更新数据库。你只需要调用Migrate()。 IsAppVersionOlder指示您的应用程序是使用旧版本的db架构(可能是较新的应用程序的另一个副本已更新数据库)。使用,您可以阻止旧应用程序运行并破坏更新的数据库。
    2. //

      using System;
      using System.Collections.Generic;
      using SubSonic;
      using SubSonic.Migrations;
      
      namespace MyApps.Migrations
      {
          internal static class MigrationHelper
          {
              const string NameSpace = "MyApps.Migrations";
              private const string SCHEMA_INFO = "SubSonicSchemaInfo";
              public static int CurrentVersion { get { return currentVersion; } }
              public static int AppVersion { get { return latestVersion; } }
              public static bool IsUpdateAvailable { get { return (updateVersion.Count > 0); } }
              public static bool IsAppVersionOlder { get; private set; }
              public static bool Checked { get; internal set; }
              private static int currentVersion;
              private static int latestVersion;
              private static List<string> updateVersion;
              private static List<string> availableVersion;
      
              static MigrationHelper()
              {
                  Checked = false;
              }
      
              /// <summary>
              /// Migrates the specified migration directory.
              /// </summary>
              public static void CheckForMigration()
              {
                  currentVersion = Migrator.GetCurrentVersion("YourProviderName");
                  Type[] allTypes =
                              System.Reflection.Assembly.GetExecutingAssembly().GetTypes();
                  availableVersion = new List<string>();
                  foreach (Type type in allTypes)
                  {
                      if (type.Namespace == NameSpace)
                          if (type.Name.Substring(0, 1) == "_")
                              availableVersion.Add(type.Name);
                  }
      
                  availableVersion.Sort();
                  updateVersion = new List<string>();
                  foreach (string s in availableVersion)
                  {
                      int version = 0;
                      if (int.TryParse(s.Substring(1,3), out version))
                      {
                          if (version > currentVersion)
                          {
                              updateVersion.Add(s);
                          }
                          latestVersion = version;
                      }
                  }
                  IsAppVersionOlder = (latestVersion < currentVersion);
                  //log.WriteLine(string.Format(
                  ///"CheckForMigration: DbVer = {0}, AppVer = {1}, UpdateAvailable = {2}, IsAppOlder = {3}",
                      //currentVersion, latestVersion, updateVersion.Count, IsAppVersionOlder));
                  Checked = true;
              }
      
              internal static void Migrate()
              {
                  foreach (string s in updateVersion)
                  {
                      Migration _migration = (Migration)Activator.CreateInstance(
                          System.Reflection.Assembly.GetExecutingAssembly().GetType(
                          "MyApps.Migrations." + s));
                      _migration.Migrate("YourProviderName", Migration.MigrationDirection.Up);
                      IncrementVersion();
                  }
              }
      
              private static void IncrementVersion()
              {
                  new Update(SCHEMA_INFO, 
                  "YourProviderName").SetExpression("version").EqualTo("version+1").Execute();
              }
      
          }
      }
      

      SubSonic将自动将一个名为SubSonicSchemaInfo的表添加到您的数据库,以帮助跟踪数据库版本。

      这是一篇很长的帖子,希望我没有错过任何东西

答案 2 :(得分:0)

NHibernate可以更新架构还是删除它并重新创建它?