Застрял в подходе миграции EF
Я каким-то образом получил проект EF5 в состоянии, в котором я не могу продолжить.
Когда я делаю "базу данных обновлений", я получаю:
Невозможно обновить базу данных в соответствии с текущей моделью, так как есть ожидающие изменения, и автоматическая миграция отключена. Либо записывайте ожидающие изменения модели в миграцию на основе кода, либо разрешайте автоматическую миграцию. Установите DbMigrationsConfiguration.AutomaticMigrationsEnabled в true, чтобы включить автоматическую миграцию. Вы можете использовать команду "Добавить-Миграция" для записи изменений ожидающих моделей на перенос на основе кода.
ok, отлично, поэтому я пытаюсь "добавить-перенаправить", и я получаю:
Невозможно создать явную миграцию, поскольку ожидаются следующие явные миграции: []. Примените ожидающие явные миграции, прежде чем пытаться генерировать новую явную миграцию.
20 GOTO 10??
что я должен делать в этот момент? (кроме перехода на NHibernate?)
Ответы
Ответ 1
Что для меня работало:
- Возврат всех моих изменений (сначала создание резервной копии) обратно в известное хорошее состояние.
- Выполнение
add-migration DummyMigration
. Это вызвало некоторые ложные изменения, которые я прокомментировал.
- Вызывается
update-database
, чтобы добавить метаданные миграции + в таблицу [__MigrationHistory]
.
- Внесите необходимые изменения (из резервной копии кода, который я использовал ранее).
- Сделайте обычный
add-migration
/update-database
.
Не идеально, и было бы здорово увидеть, есть ли лучшее решение, но это сработало для меня.
Ответ 2
Для меня проблема заключалась в том, что мы переименовали пространство имен миграции 2014123456_Initial.cs.
Но VS не восстановил пространство имен в связанном с ним файле 2014123456_Initial.Designer.cs.
После того, как Designer.cs был изменен для использования одного и того же пространства имен, все это снова заработало.
(также опубликовал это как ответ здесь, потому что оба вопроса настолько похожи)
Ответ 3
Я ошибся в базе данных создания
using System.ComponentModel.DataAnnotations;
using System.Globalization;
namespace ProductsManager.Models
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Production { get; set; }
public string Size { get; set; }
public decimal<--- Price { get; set; }
public string Barcode { get; set; }
}
}
после добавления-переноса Начал я понял и изменил код на общедоступный int Price {get; задавать; }
сделал такую же добавку-миграцию DummyMigration и ее созданную в папке миграции
080372472_dummyMigration
namespace IdetityBeta.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class DummyMigration : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Products", "Price", c => c.String());
}
public override void Down()
{
AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}
}
}
Итак, была решена база данных обновлений и проблема
Ответ 4
Я обошел это с помощью
- Запустить "Обновить базу данных - Script -Force"
- обратите внимание на последнюю явную попытку миграции перед ошибкой "Не удалось обновить базу данных..."
- Запустите "Обновить базу данных - Script -TargetMigration [lastmigration]", используя последний перенос, отмеченный предыдущей попыткой
Затем я мог запустить в script и добавить новую миграцию. Это на EF6 и Nuget 2.8 - возможно, это не сработало, когда вопрос был отправлен.
Ответ 5
Я изменил следующее значение в моем классе Configuration.cs
от false
до true
.
AutomaticMigrationsEnabled = true;
В папке App_Data я переименовал мою базу данных проекта - файл с окончанием .mdf(поэтому будет создан новый), а в консоли диспетчера пакетов я ввел следующую команду:
обновление базы данных,
после чего ожидающие миграции выполнялись гладко.
Обратите внимание, что это сработало для меня, но я не 100%, если это лучшая практика. В любом случае это Руководство Entity Framework Code First для миграций говорит:
"Если вы получаете сообщение об ошибке, указывающее, что таблица уже существует и не может быть создана, возможно, это потому, что вы запустили приложение после удаления базы данных и до того, как вы выполнили обновление базы данных. В этом случае удалите фильмы .mdf снова и повторите команду update-database. Если вы все еще получаете сообщение об ошибке, удалите папку миграции.."
Также о AutomaticMigrationsEnabled = true;
этой статье MSDN, Data Points: The First Migrations Mystery: Solved говорится:" Миграции могут запускаться автоматически, что означает, что изменения модели будут обнаружены, и миграции, соответствующие изменениям, будут созданы и запущены в базе данных. Все это происходит во время выполнения во время инициализации базы данных. Автоматические миграции удобны для простых приложений, но у вас очень мало контроля над ними, и я обычно не делаю рекомендую включить их. Я был счастлив, когда Code First переключил значение по умолчанию на false.