Ошибка миграции Entity Framework - последовательность не содержит элементов
команда: добавить-миграция бла-бла -вербоз
ошибка: последовательность не содержит элементов
Я сделал несколько вещей, прежде чем получить эту ошибку. Я внес изменения в модель с первым кодом, но не запустилadd-migration
еще. Затем я добавил модель EDMX, чтобы визуально поиграть с идеей. Я понял, что модель EDMX портит мой код, и удалил его. Я пытался бежать add-migration
и получил "Последовательность не содержит элементов". Я обновил до EF 5 и удалил старый пакет Migrations, за исключением моих конфигураций. Потом я попробовал add-migration
снова, и я все еще получаю "Последовательность не содержит элементов". Ниже остальная часть ошибки.
System.InvalidOperationException: Sequence contains no elements
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.GetQualifiedTableName(XDocument model, String entitySetName)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<FindRenamedIndependentAssociationColumns>b__ba(<>f__AnonymousType16`2 <>h__TransparentIdentifieraa)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
at System.Linq.Enumerable.<ConcatIterator>d__71`1.MoveNext()
at System.Linq.Enumerable.<DistinctIterator>d__81`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, String connectionString)
at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges)
at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()
at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
Sequence contains no elements
9 ответов
Похоже, ошибка. Вы не возражаете против подачи его по адресу http://entityframework.codeplex.com/workitem/list/advanced с подробностями, позволяющими воспроизвести проблему?
Эта проблема возникает у меня при попытке определить тип и размер столбца с DataAnnotations
,
ПЛОХОЙ:
[Column(TypeName="VARCHAR(254)")]
public string ColumnName { get; set; }
ХОРОШО:
[MaxLength(254)]
[Column(TypeName="VARCHAR")]
public string ColumnName { get; set; }
Что стало причиной проблемы для меня, так это изменение названия вместе с изменением отношений, связанных с сущностью.
Таким образом, мое решение в моем случае было:
- Изменение имени обратно на старое
- Добавление миграции (тогда смог это сделать)
- Обновление базы данных
- Изменение имени объекта и создание новой миграции
Однако может быть много других причин этой проблемы - например, удаление миграции после ее применения. К сожалению, ни в одном из них эта ошибка не имеет смысла.
В моем случае это произошло из-за ошибки с моей стороны. В моей конфигурации я случайно включил свойство навигации вместо свойства, представляющего столбец, например:
HasIndex(x => new { x.ID, x.Parent }).IsUnique();
что должно было быть
HasIndex(x => new { x.ID, x.ParentID }).IsUnique();
Это легко упустить из виду, особенно в более сложных сценариях.
Я получил эту ошибку при использовании Fluent API в OnModelCreating
как это:
modelBuilder.Entity<ApplicationUser>()
.Property(b => b.Id)
.HasColumnType("nvarchar(128)");
Поменял на это и тогда все заработало:
modelBuilder.Entity<ApplicationUser>()
.Property(b => b.Id)
.HasColumnType("nvarchar")
.HasMaxLength(128);
Обратите внимание, что с помощью nvarchar(MAX)
и подобное не является проблемой и не вызовет этой ошибки.
modelBuilder.Entity<ApplicationUser>()
.Property(b => b.PasswordHash)
.HasColumnType("nvarchar(MAX)");
Я столкнулся с той же проблемой, когда существует наследование между двумя объектами, и я хотел создать индекс свойства для одного из них. Существует согласно отчетности ошибки по этому вопросу на версии 6.3.
Когда я удалил наследование или индекс, миграция была успешно создана. В качестве обходного пути вы можете создать индекс вручную.
Я также столкнулся с этим, потому что я пытался запустить миграцию с классом без модификатора публичного доступа.
Как только я добавил это - ошибка была решена.
Я столкнулся с той же проблемой, но обнаружил эту проблему: Миграции: "Последовательность не содержит элементов" в модели отличается после переименования свойства PK, когда отношение с самоссылкой не имеет свойства FK (независимая ассоциация), в которой я застрял, это ошибка, но есть предложенный пользователем обходной путь, который я считаю хорошим решением:
"Моя таблица имела собственные ссылки, удалив столбец внешнего ключа, а затем добавив миграцию, исправила проблему и позволила переименовать свойство
Шаги, чтобы исправить, если это помогает:
- Удалите (прокомментируйте) внешние ссылки на внешние ключи и создайте миграцию, Update-Database
- Переименовать проблемный столбец, Scaffold другой перенос, Update-Database
- Раскомментируйте собственные ссылки на внешние ключи и создайте миграцию, Update-Database
- Удалите код (но оставьте миграцию), сгенерированную шагами 1 и 3
Тестирование исправления:
- Обновите базу данных, цель перед переходом № 1
- Обновите базу данных до последней миграции и убедитесь, что она не потерпит неудачу."
Это случилось со мной, когда я делал это для небольшого веб-проекта.
Файл.csproj не удалось загрузить один раз, и Visual Studio решила изменить проект по умолчанию на случайный, который загрузился.
Поскольку файл app.config в новом проекте по умолчанию не содержал никаких строк подключения... EF не смог найти место для обновления.
Сменив мой проект по умолчанию обратно на мой веб-проект, щелкнув правой кнопкой мыши по проекту и выбрав Set As Startup Project, я решил эту проблему.
Но я предполагаю, что проблема заключалась в том, что EF искал первую строку подключения в конфигурации по умолчанию, а количество доступных строк было 0.