Nano Hash - криптовалюты, майнинг, программирование

DevExpress XPO против NHibernate против Entity Framework: проблема с обновлением базы данных

Как лучше всего обновить базу данных с помощью ORM (DevExpress XPO, NHibernate или MS Entity Framework)?

Я начинаю новый проект и выбираю ORM. Процесс разработки требует довольно частого выпуска промежуточных тестовых сборок, и вероятно, что каждая сборка будет иметь изменения в структуре базы данных. Каждая новая версия должна аккуратно обновлять БД, чтобы сохранить текущие данные.

Для старых решений я бы предоставил набор сценариев SQL для обновления базы данных с v1 до v2, с v2 до v3 и т. д. и выполняем их последовательно.

Но как это будет работать с ORM? Стоит ли мне писать сценарии SQL для обновления БД?

Я понимаю, что простое добавление новых полей не вызовет проблем (например, см. метод UpdateSchema () для XPO), но что, если мне придется разделить таблицу и перераспределить текущие записи в 2 новые таблицы?



Ответы:


1

Я не могу комментировать другие ORM, но я использую DevExpress XPO для корпоративного казначейского приложения с 2007 года. Схема немного меняется с каждым выпуском, но также были и некоторые большие изменения схемы за эти годы. Несколько расширенная версия стандартного механизма обновления XPO комфортно учла все изменения.

здесь есть полезная основная информация об обновлении приложений XPO.

  • DevExpress предоставляет инструмент DBUpdater, который поможет вам в обновлении производственных сред. Вы можете расширить этот инструмент для удовлетворения дополнительных требований. В моем приложении мы добавили несколько параметров для ведения журнала, предварительного просмотра с откатом и т. Д.

  • У каждого модуля есть виртуальные UpdateDatabaseBeforeSchemaUpdate() и UpdateDatabaseAfterSchemaUpdate() методы. В них вы можете значительно контролировать процесс обновления.

Как вы упомянули, некоторые обновления будут выполняться автоматически XPO (например, добавление нового столбца), но для некоторых вещей требуется дополнительный контроль, например, инициализация нового столбца со значением по умолчанию для существующих записей.

Например, предположим, что MyNewField был добавлен в класс MyEntity XPO в версии 2.0 вашего приложения. Допустим, для существующих записей по умолчанию должно быть установлено значение 3. XPO обработает создание нового столбца, но существующие записи будут NULL. (Если вы укажете значение по умолчанию в классе XPO, оно будет относиться только к новым записям). Чтобы исправить значение для существующих записей, вы должны добавить что-то вроде следующего в переопределенный UpdateDatabaseAfterSchemaUpdate() модуля сущности:

public override void UpdateDatabaseAfterUpdateSchema()
{
    base.UpdateDatabaseAfterUpdateSchema();
    if (CurrentDBVersion < new Version(2, 0, 0, 0))
        ObjectSpace.GetSession().ExecuteNonQuery(
            "UPDATE [MyEntity] SET [MyNewField] = 3 WHERE [MyNewField] IS NULL");
}

(Вы также можете использовать ObjectSpace.GetObjects<MyEntity>() и foreach, если предпочитаете избегать прямого SQL.)

В вашем более крайнем примере разделения таблицы на две вы можете использовать тот же метод, но вместо этого вы должны переопределить UpdateDatabaseBeforeUpdateSchema(), запустить SQL для разделения таблицы, позволить XPO выполнить любые другие обновления схемы и, при необходимости, заполнить любые значения по умолчанию. в UpdateDatabaseAfterUpdateSchema().

Вы обнаружите, что столкнетесь с проблемами ограничений, например, нарушениями внешнего ключа, поэтому вам может потребоваться написать некоторые общие процедуры, такие как DropAllForeignKeyConstraints(), как часть UpdateDatabaseBeforeUpdateSchema(). Иногда вы обнаруживаете, что XPO уже что-то предоставляет, иногда нет. Отсутствующие ограничения и индексы будут восстановлены при обновлении схемы. (По моему опыту, переключение первичного ключа таблицы основных данных оказалось самой сложной процедурой обновления, которую нужно выполнить.)

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

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

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

Мы работаем с крупными международными компаниями и банками. Результатом остались довольны покупатели. В ситуациях, когда корпоративному администратору баз данных необходимо подписывать изменения, они, кажется, не возражают против использования инструмента командной строки для выполнения обновления, а не сценария.

15.06.2012
  • То, что вы описали, относится к XAF, а не конкретно к XPO. 02.10.2013

  • 2

    Большинство решений для миграции могут обрабатывать простые задачи, такие как добавление нового столбца, отношения или удаление одного, но не работают, когда вы переименовываете столбец (это добавление? Или удаление после добавления, которое равно переименованию? Что вы должны делать с данные в таком случае?)

    Все три решения имеют базовую поддержку миграции, XPO даже позволяет запускать собственные скрипты как часть процесса (для вставки статических / тестовых / непрерывных данных и т. Д.)

    Также существует проект MigratorDotNet, который вы можете использовать и не полагаться на какие-либо особые функции ORM в отношении миграции. .

    Лично я бы использовал автоматическую миграцию только в среде разработки / тестирования и имел бы полный набор сценариев обновления при работе с конкретной клиентской базой данных, чтобы сказать обновление с v1 до v2.

    21.05.2012
  • Спасибо за быстрый ответ. Я использую Apex SQL Tools для создания сценария SQL для обновления. Но меня беспокоит то, что сценарии SQL для обновления убивают независимость ORM от типа базы данных. 21.05.2012
  • Но помните, что ORM нужен только для решения другой проблемы, а именно чтения из / в базу данных. Обновление схемы - это еще одна проблема, которую лучше всего решить с помощью другого инструмента, будь то Migrator.NET или внешние инструменты, такие как Apex SQL Tools. 21.05.2012

  • 3

    Как это будет работать с ORM? Стоит ли мне писать сценарии SQL для обновления БД?

    Четкий ответ на этот вопрос должен быть в потоке stackexchange программиста - Каковы критерии оценки ORM для .NET?, я получил простой ответ на ваш вопрос, который совпадает с моим опытом работы с ORM при разработке проекта с использованием Entity framework и шаблонов ORM Code smith.

    Как ORM управляет изменениями в модели данных? что, если мне придется разделить таблицу и перераспределить текущие записи в 2 новые таблицы?

    Некоторые могут обновлять БД автоматически в определенных пределах, другие ничего не делают, и вам придется делать грязную работу самостоятельно; другие предоставляют основу для обработки изменений, которая позволяет вам контролировать обновления базы данных. Это означает, что каждые пару дней кто-то должен тратить час на обновление модели, чтобы добавить таблицу или изменить типы данных, которые изменение

    Ссылка:
    https://softwareengineering.stackexchange.com/questions/6543/what-are-the-benefits-of-using-database-abstraction-by-orm
    https://softwareengineering.stackexchange.com/questions/41739/best-arguments-for-Again-Introduction-orm-technology-into-a-companies-dev-proc/41833#41833

    21.05.2012

    4

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

    Существует множество сценариев, в которых многие ORM не могут обеспечить поддержку ваших конкретных потребностей в базе данных, например при создании хранимых процедур создавайте индексы и представления или даже индексированные представления / материализованные таблицы без написания сценариев sql. Такие проблемы, как добавление нового столбца, не допускающего значения NULL, к существующей таблице гораздо сложнее решить с помощью ORM-Migration-Code, чем написанием сценариев SQL.

    Текущие инструменты, такие как Visual Studio Data Tools, лучше справляются с подобными проблемами.

    16.11.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование