2016-04-19 3 views
0

У меня есть объект DBContext, который содержит определения всех моих объектов базы данных. Когда я запускал приложение в первый раз, он создал базу данных. Это сейчас в производстве.Первая миграция кода не найдена в базе данных

Теперь мне нужно было внести изменения модели в DEV, и поэтому мне нужно будет использовать First First Migrations для генерации SQL-скрипта, который делает необходимые изменения схемы в prod при отпускании.

Как я понял, я мог бы добавить новую миграцию с помощью команды add-migration, и это будет сравнивать то, что находится в моей существующей базе данных с определением модели, и сгенерировать для меня сценарий, который позволит мне обновлять базу данных. Однако, когда я запускаю команду add-migration, она создает для меня миграцию, которая представляет собой полную базу данных, а не просто новые объекты.

Мои объекты базы данных находятся в отдельной библиотеке классов, я открыл консоль диспетчера пакетов, выбрал проект по умолчанию для моей библиотеки классов DB.

Под Configuration.cs я имею

internal sealed class Configuration : DbMigrationsConfiguration<Centrica.EMT.Database.Context.EmtDataContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 
      ContextKey = "Centrica.EMT.Database.Context.EmtDataContext"; 
     } 

И в app.config этой библиотеки классов У меня есть

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <connectionStrings> 
    <add name="Centrica.EMT.Database.Context.EMTDataContext" connectionString="Initial Catalog=EMTProd;Data Source=WYCVWWEBD016\COMPUTECLUSTER;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

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

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

Обновлено

public class EmtDataContext : DbContext 
    { 
     public EmtDataContext() 
     { 
      //todoSystem.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<EmtDataContext>()); 
      var objectContextAdapter = this as IObjectContextAdapter; 
      var objectContext = objectContextAdapter.ObjectContext; 
      objectContext.CommandTimeout = Database.Connection.ConnectionTimeout; 
     } 
+0

Я думаю, здесь есть небольшое недоразумение. Когда вы впервые включаете перенос, самый первый сценарий миграции действительно заполнен созданием таблицы. Только после того, как вы потом что-то измените и запустите add-migrations, вы получите еще один сценарий миграции, описывающий дельта. У меня есть аналогичная настройка, и у меня есть файл с именем _InitialCreate.cs, который действительно заполнен CreateTable() –

+0

А я вижу. Я просто запустил приложение и установил инициализатор в CreateDatabaseIfNotExists. Есть ли какой-либо способ, когда я могу использовать миграцию, учитывая, что я не создал существующий? – NZJames

+0

Да. Вы можете использовать MigrateDatabaseToLatestVersion, что и должно быть запущено в процессе производства –

ответ

0

Миграции не смотрят на базу данных, чтобы определить сценарий - они смотрят на последней миграции и сделать диф. Если нет предварительной миграции, вы получаете всю базу данных, написанную на сценарии. Путь вокруг этого состоит в том, чтобы сделать "add-migration Baseline -IgnoreChanges", который просто обновляет моментальный снимок без генерируемого кода. Тогда все последующие миграции будут новыми объектами. Единственное, что EF ищет в базе данных, это таблица __MigrationHistory, чтобы увидеть, была ли применена миграция.

Как я понимаю, ваша DEV теперь впереди PROD поэтому у вас есть несколько вариантов:

1) установить базовый уровень перед вашей моделью изменения:

  • Определение модели изменений и рулон их обратно.
  • add-migration Базовая линия -IgnoreChanges // Это создаст моментальный снимок текущего состояния.
  • update-database // Добавляет __MigrationHistory и вставляет запись.
  • Повторно примените изменения модели, добавление-перенастройка будет теперь содержать только изменения.

2) Сделайте дополнительную миграцию, которая будет скриптировать все объекты. Вы можете прокомментировать из объектов, которые уже существуют, и применить остальные к PROD.

См https://msdn.microsoft.com/en-US/data/dn481501

Что касается производства, то вы получите разные мнения о том, следует ли запускать миграции с базой данных PROD. Наши администраторы отказались от этого, поэтому мы просто даем им сгенерированные скрипты. См. http://cpratt.co/migrating-production-database-with-entity-framework-code-first/#at_pco=smlwn-1.0&at_si=54ad5c7b61c48943&at_ab=per-12&at_pos=0&at_tot=1

 Смежные вопросы

  • Нет связанных вопросов^_^