O / R мапперы, которые могут автоматически обновлять схему базы данных? - PullRequest
3 голосов
/ 16 декабря 2008

Существуют ли какие-либо средства O / R, которые будут автоматически создавать или изменять схему базы данных при обновлении бизнес-объектов? После осмотра кажется, что большинство библиотек работают по-другому, создавая бизнес-объект из схемы базы данных.

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

Другое требование заключается в том, что картограф поддерживает файловую базу данных, такую ​​как SQLite или JET, а не только сервер SQL.

Я знаю, что XPO от Developer Express имеет такую ​​возможность, но мне было интересно, есть ли какие-нибудь альтернативы.

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 декабря 2008

NHibernate может создать схему базы данных из бизнес-объектов для вас.

1 голос
/ 17 декабря 2008

SubSonic делает то, что вам нужно. У него есть класс миграции для использования с sonic commander. Я изменил код и поместил его в автозагрузку моих приложений, чтобы он проверял разницу версий и обновлялся автоматически. Вот как вам нужно его настроить:

  1. Вам необходимо добавить версионный класс миграции. Возможно, вы захотите взглянуть на этот учебник , если вы никогда раньше не пользовались SubSonic. Следующий класс сохраняется как \ Migrations \ 001_initial.cs. Если вы вызвали migrate.exe (внутри VS) из subsonic, он обновит текущую базу данных до последней доступной версии. Для правильной работы migrate.exe необходимо сохранить префикс версии из 3 цифр в качестве имени файла, как указано в руководстве. Что касается имени класса, префикс версии с подчеркиванием и 3 цифрами необходим для написанного мной класса миграции, чтобы правильно определить версию.

// * Не уверен, зачем мне нужна эта строка, чтобы код работал ниже

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 указывает, что ваше приложение создано с использованием более старой версии схемы БД (возможно, другая копия более новых приложений обновила БД). С его помощью вы можете предотвратить запуск и повреждение старых приложений старыми приложениями.

//

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();
        }

    }
}

Таблица с именем SubSonicSchemaInfo будет автоматически добавлена ​​SubSonic в вашу базу данных, чтобы помочь отслеживать версию базы данных.

Это длинный пост, надеюсь, я ничего не пропустил

0 голосов
/ 16 декабря 2008

Может ли NHibernate обновить схему или она удаляется и воссоздает ее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...