【问题标题】:Entity Framework Migrations Error - Sequence contains no elements实体框架迁移错误 - 序列不包含任何元素
【发布时间】:2012-09-12 02:39:55
【问题描述】:

命令: add-migration blahblah -verbose
错误:序列不包含任何元素

在收到此错误之前我做了一些事情。我对我的代码优先模型进行了更改,但还没有运行add-migration。然后我添加了一个 EDMX 模型来直观地玩弄一个想法。我意识到 EDMX 模型弄乱了我的代码,所以我删除了它。我尝试运行add-migration 并得到“序列不包含元素”。我升级到 EF 5 并卸载了旧的迁移包,但我的配置除外。然后我再次尝试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

【问题讨论】:

  • 我找到了回溯的方法。从现在开始,我将使用某种版本控制。仍然不知道这个错误是什么意思。

标签: .net entity-framework ef-code-first ado.net-entity-data-model edmx


【解决方案1】:

当我尝试使用DataAnnotations 定义列的类型和大小时,我会遇到这个问题。

不好:

[Column(TypeName="VARCHAR(254)")]
public string ColumnName { get; set; }

好的:

[MaxLength(254)]
[Column(TypeName="VARCHAR")]
public string ColumnName { get; set; }

【讨论】:

  • 这个!这为我解决了。 EF 处理数据注释的方式似乎是一个错误(?)?无论如何,谢谢你!
  • [Column(TypeName = "decimal(8,2)")] 也会发生这种情况。
  • #M.你用小数做了什么来解决你的问题?
  • 这也发生在 [Column(TypeName="boolean")] ... 将其更改为 bit
  • 在我的流利配置文件 .HasColumnType("varchar(50)").IsOptional() 上收到相同的错误,但 .HasColumnType("varchar").IsOptional().HasMaxLength(50 ) 修复它
【解决方案2】:

导致我遇到问题的原因是更改名称以及更改与实体关联的关系

所以我的解决方案是:

  • 改回旧名称
  • 添加迁移(然后能够做到)
  • 更新数据库
  • 更改实体名称并生成新迁移

不过,此问题可能还有许多其他原因 - 例如应用后删除迁移。不幸的是,在它们中,这个错误都没有意义。

【讨论】:

    【解决方案3】:

    看起来像一个错误。您介意将其提交至http://entityframework.codeplex.com/workitem/list/advanced,并附上允许重现问题的详细信息吗?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我也遇到了这个问题,因为我试图运行一个缺少公共访问修饰符的类的迁移。

        一旦我添加了这个 - 错误就解决了。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题, 我发现了这个问题:Migrations: "Sequence contains no elements" in model differ after renaming PK property when self-referencing relationship with no FK property (independent association) 这是我遇到的情况。这是一个错误,但有用户建议的解决方法,我认为这是一个很好的解决方案:

          “我的表是自引用的,删除外键列然后添加迁移解决了问题并允许重命名属性

          修复步骤,如果有帮助:

          1. 删除(注释)自引用外键并构建迁移、更新数据库
          2. 重命名问题列,Scaffold 另一个迁移,Update-Database
          3. 取消注释自引用外键并为迁移搭建脚手架, 更新数据库
          4. 删除步骤 1 和 3 生成的代码(但保留迁移)

          测试修复:

          1. 更新数据库,在第 1 步迁移之前定位
          2. 更新数据库到最近的迁移并确保它没有 失败。”

          【讨论】:

          【解决方案7】:

          当我为一个小型网络项目做这件事时,这发生在我身上。

          网络的 .csproj 有一次加载失败,Visual Studio 决定将默认项目更改为可以加载的随机项目。

          因为新的默认项目中的 app.config 不包含任何连接字符串... EF 找不到要更新的地方。

          通过右键单击项目并选择设置为启动项目,将我的默认项目改回我的网络项目,为我解决了这个问题。

          但我猜这里的问题是 EF 在默认配置中寻找第一个连接字符串,可用的字符串数量为 0。

          【讨论】:

            【解决方案8】:

            当两个实体之间存在继承时,我遇到了同样的问题,我想在其中一个实体的属性上创建索引。 6.3 版有一个reported bug on this issue

            当我删除继承或索引时,迁移已成功创建。作为一种解决方法,您可以手动创建索引。

            【讨论】:

              【解决方案9】:

              就我而言,这是由于我的错误。在我的配置中,我不小心包含了一个导航属性,而不是代表该列的属性,例如:

              HasIndex(x => new { x.ID, x.Parent }).IsUnique();
              

              应该是的

              HasIndex(x => new { x.ID, x.ParentID }).IsUnique();
              

              这很容易被忽视,尤其是在更复杂的场景中。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-09-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-07-01
                相关资源
                最近更新 更多