Подтвердить что ты не робот

Нет первоначального создания с миграциями Entity Framework

Я пытаюсь заставить миграции структуры Entity работать. Я включил первые миграции кодов, создал папку миграции, файл конфигурации и таблицу истории миграции, но не начал создавать. Мне не хватает шага? Это новый db, созданный EF (4.3.1).

4b9b3361

Ответ 1

Поведение по умолчанию не по умолчанию, но оно доступно вам легко в разных формах.

  • Вы можете вызвать context.Database.CreateIfNotExists(); при запуске приложения.

  • Вы можете использовать один из встроенных DatabaseInitializer s. Инициализатор CreateDatabaseIfNotExists встроен в EntityFramework и должен быть добавлен в ваш проект.

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

Вы можете включить DatabaseInitializers в свой проект либо по коду, либо через файл конфигурации.

Включить инициализатор базы данных EntityFramework через код:

В вашем приложении вы можете настроить DatabaseInitializer следующим образом:

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>());

ПРИМЕЧАНИЕ: этот код несколько раз менялся в течение всего срока действия сущ. Этот пример относится к EF 4.3, который является текущей производственной версией, доступной через nuget.

Включить инициализатор базы данных EntityFramework через элемент конфигурации:

<configuration>
  <entityFramework>
    <contexts>
      <context type="MyNamespace.MyEFDataContext, AssemblyName">
        <databaseInitializer
          type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName],
               [MyNamespace.Migrations.Configuration,  AssemblyName]], EntityFramework" />
      </context>
    </contexts>
  </entityFramework>
</configuration>

Вы заметите, что это может быть немного "неприлично" с этой конфигурацией. Вам необходимо заменить AssemblyName выше на имя сборки, в которой вы храните свой материал entityframework, замените MyNamespace.MyEFDataContext на полное имя вашего контекста данных сущностной фразы и замените MyNamespace.Migrations.Configuration на полное имя вашего класса конфигурации (по умолчанию в папке "Миграция" внутри вашего проекта).

EDIT: Отредактировано для ответа на дополнительные комментарии

Миграция - это переход от определения одной схемы к другому определению схемы. Создание пустой базы данных не является миграцией (но все после этого). В вашем проекте не будет файла с исходным кодом миграции, чтобы просто создать пустой db, который выполняется в коде инициализатором.

Если вы уже используете инициализатор DropCreateDatabaseAlways, он должен это делать. Тем не менее, я заметил, что вы устанавливаете инициализатор в коде, что означает, что есть возможность проблемы с синхронизацией (установка инициализатора после того, как ваш контекст уже прошел точку вызова каких-либо инициализаторов).

Вы можете заставить сущность-схему запускать ваш инициализатор в любой точке кода с помощью context.Database.Initialize(true); (параметр является истинным/ложным, чтобы принудительно инициализировать независимо от текущего состояния). Это уменьшит и воссоздает вашу базу данных каждый раз.

Но вы также можете просто убедиться, что ваш инициализатор настроен как можно раньше в жизненном цикле вашего приложения (до того, как вы создали один экземпляр вашего контекста).

Ответ 2

"Начальное создание" НЕ создается автоматически! Вам нужно создать это самостоятельно. Некоторые учебники EF запутывают, и у меня было такое же недопонимание, как и вы.

Что вам нужно сделать:

-Add-Migration InitialModel

Если вы уже создали свои таблицы базы данных и модель домена, то:

-Add-Migration InitialModel -IgnoreChanges

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

Ответ 3

Статья/учебник здесь здесь (на microsoft.com) описывает причину, по которой миграция initialCreate не существует. Миграция будет добавлена ​​только в том случае, если база данных уже существует. В противном случае первая миграция будет "initialCreate", поскольку нет смысла создавать миграцию в базу данных, которая еще не существует... нет БД означает, что нет возврата к откату при миграции вниз.

Вот соответствующий абзац:

Запустите команду Enable-Migrations в консоли диспетчера пакетов Эта команда добавила папку Migrations в наш проект, эта новая папка содержит два файла:

Класс конфигурации.. Этот класс позволяет вам настроить поведение Migrations для вашего контекста. Для этого пошагового руководства мы просто используем конфигурацию по умолчанию. Поскольку в вашем проекте имеется только один контекст Code First, Enable-Migrations автоматически заполняет тип контекста, к которому применяется эта конфигурация.

Первичная установка. Эта миграция была сгенерирована, потому что у нас уже был Code First, создав для нас базу данных, прежде чем мы включили миграции. Код в этой миграции с помошью представляет собой объекты, которые уже были созданы в базе данных. В нашем случае это таблица Blog с столбцами BlogId и Name. Имя файла содержит временную метку, чтобы помочь с упорядочением.

Если база данных еще не была создана, эта миграция InitialCreate не была бы добавлена ​​в проект. Вместо этого, в первый раз, когда мы вызываем Add-Migration, код для создания этих таблиц будет привязан к новой миграции.

Ответ 4

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

С запуском проекта запуска в решении, а также коммандой projet в консоли диспетчера пакетов я смог создать первую миграцию.

Кроме того, make shure имеет строку соединений с именем вашего класса dbContext, чтобы диспетчер пакетов мог ее найти.

Ответ 5

Я использую EF 6 RC1 и столкнулся с этой проблемой, когда при запуске Enable-Migrations не создавались ни InitialCreate, ни __MigrationHistory.

На самом деле, сразу после обновления с EF 5 до EF 6 я запустил Enable-Migrations и по какой-то причине создал таблицу __MigrationHistory с помощью схемы EF 5, поэтому я удалил ее и свой каталог Migrations и попытался начать работу.

Но каждый раз, когда я удалял каталог Migrations, он не создавал InitialCreate или __MigrationHistory. Я попытался сбросить и воссоздать базу данных и перезапустить Visual Studio 2012 безрезультатно. Я сдался на следующий день, а на следующее утро попытался снова - после того, как мой компьютер сидел около 8 часов, он создал InitialCreate. Я предполагаю, что должен быть кеш где-то, у которого есть действительно длинный тайм-аут - кто-нибудь? Я также предполагаю, что перезагрузка может очистить кеш, но я этого не делал.

В любом случае можно использовать PM> Add-Migration InitialCreate для выполнения этого шага вручную.

В любом случае, я до сих пор не получил таблицу __MigrationHistory. По-видимому, EF 6 изменился с создания его во время команды Enable-Migrations вместо того, чтобы создавать его только во время команды Update-Database. И так как моя схема уже была создана в этот момент, мне нужно было оторвать ее и заново создать ее вручную:

PM> Update-Database -TargetMigration:0
PM> Update-Database

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

После запуска обеих команд она создала таблицу __MigrationHistory - и она не создала ее как системную таблицу (чего я действительно не хотел), так что все хорошо. Не совсем такая же проблема, как OP, но, надеюсь, это будет полезно для кого-то другого.

Литература:

Ответ 6

Я знаю, что это старый, но ответа нет, и у меня была такая же проблема.

Трюк - команда Enable-Migrations. Как указано здесь существует команда Enable-Migrations -EnableAutomaticMigrations. Что он делает, он начинает миграцию именно там, где вы находитесь.

Если вы хотите, чтобы первая миграция была созданием базы данных, просто запустите Включить-Миграции (без -EnableAutomaticMigrations).

И не забудьте установить инициализатор:

            Database.SetInitializer(new MigrateDatabaseToLatestVersion<LicenseContext, Configuration>());