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));
}
}


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



решение: следующий обходной путь сделал это для меня:




  1. я удалил базу данных и миграций, как описано здесь:
    https://stackoverflow.com/a/11679386/3168401

  2. Выполнено Enable-Migrations + Add-Migration Initial

  3. слил мою ручную работу .Индекс() изменяется в файл.
    Теперь обновление-база данных работает снова-также неоднократно, при удалении базы данных.

591   3  

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

обратное проектирование не помечает ключи GUID с помощью NEWSEQUENTIALID () по умолчанию как сохраненные сгенерированные идентификаторы

ни один из них не описывает вашу проблему точно, и метод 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

    Ничего не найдено.