7

Это длинный вопрос, но я был бы очень благодарен, если бы мог получить хороший совет по этому поводу. Короче говоря, я ищу хороший подход для обновления версии схемы базы данных MS SQL, которая также требует переноса данных из удаленных таблиц в новые таблицы.Как избежать потери данных при обновлении схемы базы данных EF Model First?

Я думаю, что Stack Overflow является наиболее подходящим местом для этого вопроса (а не dba.stackexchange.com), поскольку в его основе это проблема для разработчиков .NET, использующих Entity Framework, а части базы данных в основном состоят из автоматически сгенерированные SQL-скрипты.


фон

приложение .NET и базы данных SQL работает в Azure (Приложение в роли рабочих и базы данных в Azure SQL). До сих пор обновления версий работали нормально, потому что все изменения схемы базы данных были простыми (например, добавлением нового столбца). Однако отныне мне также необходимо иметь дело с перемещением данных из одной таблицы в другую во время обновлений. (Я могу исправить это временно, создав новую базу данных, сгенерирую скрипт с данными из старой базы данных и вручную отредактировав скрипт, чтобы он соответствовал новой схеме, но я надеюсь, что есть лучший подход).

Я использую Entity Framework, и я использую модель First. Объекты и ассоциации определены в Visual Studio Data Model Designer, и этот подход очень подходит для моего приложения.

Я использую dacpac для обновления базы данных Azure SQL, и этот подход сработал до сих пор (но теперь я получаю потерю данных, поэтому теперь я должен найти способ перемещения данных в новые таблицы).

Надеюсь, что я смогу продолжать использовать структуру сущностей и определять сущности/ассоциации в дизайнере, но при необходимости лучше отказаться от обновления dacpac до другой технологии.

подход Upgrade до сих

  1. я добавлять новые объекты (таблицы), ассоциации (отношения) и свойства (столбцы) в конструкторе.
  2. Я щелкаю правой кнопкой мыши, выбираю «Генерировать базу данных из модели ...», и это приводит к сценарию .sql, который отбрасывает старые объекты базы данных и создает новые объекты базы данных.
  3. Я создаю пустую базу данных и запускаю скрипт для создания таблиц/ключей и т. Д.
  4. В SQL Server Management Studio я щелкните правой кнопкой мыши базу данных и выберите «Задачи -> Извлечь приложение уровня данных ...». Когда мастер завершает работу, я получаю dacpac, в котором я нуждаюсь (на самом деле теперь я могу удалить базу данных, поскольку я только создал ее, чтобы иметь возможность получить файл dacpac, так как я не думаю, что могу сгенерировать ее в Visual Studio Data Model Designer) ,
  5. Я щелкаю правой кнопкой мыши базу данных Azure SQL и выбираю «Задачи -> Обновление приложения уровня данных ...» и следуйте указаниям мастера. До сих пор у меня никогда не было потери данных, так что это сработало нормально!

Текущая ситуация

Это упрощенный пример, чтобы проиллюстрировать эту проблему, но я буду получать в почти одинаковых ситуациях довольно часто теперь кажется. Посмотрите на старую и новую версию схемы на рисунке ниже. Предположим, что в базе данных уже есть данные. Мне нужно, чтобы данные в ImageFile попадали в ImageFileOriginal или ImageFileProcessed в зависимости от значения логического/битового IsOriginal. Используя «Обновление приложения уровня данных», я получаю предупреждение об утрате данных. Какой подход вы бы порекомендовали?Как я сказал ранее, прекрасно, если нужно, переключиться с обновления dacpac на другую технологию.

Old schema New schema

Я прочитал о Visual Studio базы данных проектов, свободный Migrator, Red Gate и Entity конструктор баз данных поколения Power Pack (Он не поддерживает Visual Studio 2012), но я не нашёл хороший способ для этого. Я признаю, что не потратил целый день на то, чтобы копаться в каждой технологии, но я, конечно, потратил некоторое время, чтобы попытаться найти хороший подход.

ответ

1

Лучший способ для переноса схемы базы данных (создание/удаление таблиц/столбцов), а также данных, использует SSDT - Инструменты SQL Server Data, доступных для Visual Studio 2010 и Visual Studio 2012.

Вот некоторые очень полезные ссылки:

http://msdn.microsoft.com/data/tools http://blogs.msdn.com/b/ssdt http://msdn.microsoft.com/en-us/data/hh297027

0

В Configuration классе набор конструктора, как показано ниже:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

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

Весь класс Configuration выглядит следующим образом.