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

Обновить Entity Framework до 6.1 - индекс уже существует

Я только что обновил проект с помощью первой модели кода от Entity Framework 6.0.2 до 6.1.0.

После обновления context.Database.CompatibleWithModel(true) возвращает значение false, поэтому EF считает, что база данных больше не совместима с моделью. Я ничего не изменил, просто обновил EF.

Я запустил Add-Migration, чтобы увидеть, что произойдет, и EF создал большую миграцию, которая, по-видимому, создает индекс для каждого свойства внешнего ключа для каждой таблицы:

    public override void Up()
    {
        CreateIndex("dbo.ActivityStreams", "UserId");
        CreateIndex("dbo.Users", "OfficeId");
        CreateIndex("dbo.Offices", "ParentId");
        CreateIndex("dbo.Rosters", "UserId");
        ...and many more similar lines...

Я предполагаю, что это связано с новыми функциями индекса в EF 6.1? Немного странно, но хорошо.

Когда я Update-Database применяется новая миграция, есть ошибки, которые уже существуют. Глядя в базу данных и на предыдущие миграции, почти все индексы действительно уже существуют.

Что я сделал здесь неправильно? Существует ли процедура обновления EF?

4b9b3361

Ответ 1

У меня была такая же проблема. Я исправил его, воссоздав Индексы.

Я выполнил это, скопировав DropIndexes из метода Down при переходе в метод Up. Так эффективно сначала удалять индексы, а затем воссоздавать их. Не знаю, почему это необходимо, но это устранило проблему.

Ответ 2

Как упоминалось в других ответах, это связано с ошибкой Entity Framework. Принятый ответ на копирование кода DropIndex в метод Up вызывает ненужную работу с базой данных. Вместо этого я бы предположил, что правильный курс действий состоит в том, чтобы удалить содержимое методов Up и Down, поскольку эти индексы уже существуют и их не нужно удалять.

Ответ 3

Re: Созданы ваши внешние ключи, я нашел следующую информацию по следующей ссылке:

http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/ утверждает следующее:

Код ForeignKeyIndexConvention Первое соглашение заставляет индексы создаваться для столбцов любого внешнего ключа в модели, если только эти столбцы уже не имеют индекса, указанного с помощью IndexAttribute. Если вы не хотите индексов для своих FK, вы можете удалить это соглашение:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
}