Обновить 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?
Ответы
Ответ 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>();
}