Entity Framework code-first: миграция завершается неудачно с update-database, силы излишни(?) добавить-миграция
у меня есть забавный эффект с помощью миграции (EF 5.0) и code-first:
Я создал несколько моделей с первичными ключами GUID. (Кстати: для меня важно, что SQL Server использует NEWSEQUENTIALID(), который вроде бы по умолчанию в текущей версии)
в какой-то момент я активировал миграций. Я добавил некоторый код к начальной миграции, это в основном .Index() по мере необходимости.
когда я удаляю базу данных и вызываю update-database, я получаю следующее ошибка:
не удается обновить базу данных в соответствии с текущей моделью, потому что там
ожидаются изменения, и автоматическая миграция отключена. Либо пишите
ожидающая модель изменяется на миграцию на основе кода или включает
автоматическая миграция. Набор
DbMigrationsConfiguration.AutomaticMigrationsEnabled в true для включения
автоматическая миграция. Для записи можно использовать команду Add-Migration
ожидающая модель изменяется на миграцию на основе кода.
I пробовал AutomaticMigrationsEnabled = true, который работал без изменения или добавления чего-либо!
но так как я не хочу!--6-->, Я также попытался удалить базу данных снова, называется update-database а то add-migration. Я закончил с дополнительной миграцией, которая, кажется, ничего не меняет (см. ниже). Я также попытался добавить эти строки в нижней части начальной миграции-но это ничего не меняет.
одна из моделей:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
начальная миграция код:
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
Ниже приведен код, созданный add-migration: он, кажется, не делает ничего нового - может быть, я что-то упустил?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
поэтому мне любопытно: что я сделал, чтобы дезориентировать миграции? И что я могу сделать, чтобы заставить его работать только с одной начальной миграцией?
решение: следующий обходной путь сделал это для меня:
- я удалил базу данных и миграций, как описано здесь:
https://stackoverflow.com/a/11679386/3168401
- Выполнено Enable-Migrations + Add-Migration Initial
- слил мою ручную работу .Индекс() изменяется в файл.
Теперь обновление-база данных работает снова-также неоднократно, при удалении базы данных.
3 ответов:
Я также попытался снова удалить базу данных, вызвал update-database и затем добавить-миграция. Я закончил с дополнительной миграцией, которая кажется ничего не менять (см. ниже)
основываясь на вышеуказанных деталях, я думаю, что вы сделали последнее дело в первую очередь. Если вы запустите
Update databaseдоAdd-migration, он не будет обновлять базу данных с вашими схемами миграции. Сначала вам нужно добавить миграцию, а затем запустить команду update.попробуйте их в этом порядке, используя консоль диспетчера пакетов.
PM> Enable-migrations //You don't need this as you have already done it PM> Add-migration Give_it_a_name PM> Update-database
Entity Framework имеет некоторые проблемы вокруг полей идентификации.
вы не можете добавить идентификатор GUID в существующую таблицу
миграции: не обнаруживает изменений в DatabaseGeneratedOption
ни один из них не описывает вашу проблему точно, и метод Down() в вашей дополнительной миграции интересно, потому что он, похоже, пытается удалить идентификатор из столбца, когда ваша таблица CREATE в начальной миграции, похоже, устанавливает его!
кроме того, если вы используете
Update-Database -ScriptилиUpdate-Database -Verboseдля просмотра sql, который выполняется из этихAlterColumnметоды вы увидите, что sql идентичен вUpиDown, и на самом деле ничего не делает. Идентичность остается неизменной (для текущей версии-EF 6.0.2 и ниже) - как описано в первых 2 вопросах, которые я связал к.Я думаю, что вы должны удалить избыточный код в вашей дополнительной миграции и жить с пустой миграции на данный момент. И вы можете подписаться/проголосовать за вопросы, которые будут решены.
ссылки:
тож менять не бублик
Включение/Выключение Идентификации С Помощью Пользовательской Операции Миграции
попробуйте это:
PM> Enable-migrations -force PM> Add-migration MigrationName PM> Update-database -force
Comments