实体框架迁移错误 - 序列不包含任何元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架迁移错误 - 序列不包含任何元素相关的知识,希望对你有一定的参考价值。
命令:add-migration blahblah -verbose 错误:序列不包含任何元素
在收到此错误之前我做了一些事情。我改变了我的代码优先模型,但还没有运行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
看起来像个bug。您是否介意在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; }
造成这个问题的原因是改变名称以及改变与实体相关的关系。
所以我的决议是:
- 将名称更改回旧名称
- 添加迁移(然后能够做到)
- 更新数据库
- 更改实体的名称并生成新的迁移
但是,这个问题可能还有许多其他原因 - 例如应用后删除迁移。不幸的是,这些错误都没有意义。
我遇到了同样的问题,我发现了这个问题:Migrations: "Sequence contains no elements" in model differ after renaming PK property when self-referencing relationship with no FK property (independent association)这是我坚持的情况。这是一个错误,但有一个用户建议的解决方法,我认为这是一个很好的解决方案:
“我的表是自引用,删除外键列,然后添加迁移修复了该问题并允许重命名该属性
修复的步骤,如果有帮助:
- 删除(注释)自引用外键并搭建迁移,Update-Database
- 重命名问题列,Scaffold另一个迁移,Update-Database
- 取消注释自引用外键并构建迁移,即Update-Database
- 删除步骤1和3生成的代码(但保留迁移)
测试修复:
- 在步骤#1迁移之前更新数据库,目标
- 更新 - 数据库到最近的迁移,并确保它不会失败。“
当我为一个小型网络项目做这件事时,这发生在我身上。
网络的.csproj无法加载一次,visual studio决定将默认项目更改为随机加载的项目。
因为新默认项目中的app.config不包含任何connectionStrings ... EF无法在任何地方找到更新。
通过右键单击项目并选择Set As Startup Project,将我的默认项目更改回我的Web项目,为我解决了这个问题。
但我想这里的问题是EF在默认配置中寻找第一个连接字符串,可用的字符串数为0。
在OnModelCreating
中使用Fluent API时出现此错误,如下所示:
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)");
我也遇到过这种情况,因为我试图在缺少公共访问修饰符的类的情况下运行迁移。
一旦我添加了这个 - 错误就解决了。
以上是关于实体框架迁移错误 - 序列不包含任何元素的主要内容,如果未能解决你的问题,请参考以下文章