【问题标题】:Sequence contains no matching element - EntityFramework序列不包含匹配元素 - EntityFramework
【发布时间】:2014-05-23 20:20:28
【问题描述】:

我正在使用 EF 6.1.0 并且正在创建 WCF 服务。

首先,我创建了一个类库,其中包含用于初始化 EF 的实体、映射器和上下文。 我还创建了一个包含上下文实例化的类并拥有以下代码:

public IQueryable<[Entity]> GetAll()
{
    return context.[Entity].AsQueryable();
}

另一方面,我在同一个项目上创建了一个 WCF 服务,并像这样调用 .svc 文件中的函数 GetAll():

public List<[Entity]> GetList()
{
    [iObject] repository = new [Object](new Context());
    return repository.GetAll().ToList();
}

项目正在建设中。我什至检查了 cconfiguration,它在正确的数据库中。但是,假设创建的数据库和表不存在,并且返回中显示错误“序列不包含匹配元素”。

如果这个令人困惑,您能否指出一些使用 Code First Entity Framework 的 WCF 服务链接。

【问题讨论】:

    标签: c# wcf entity-framework ef-code-first wcf-data-services


    【解决方案1】:

    我遇到了一个错误,我收到了带有消息 Sequence contains no matching elementSystem.InvalidOperationException,因为在我的表配置中传递给 .HasColumnType() 的字符串值不正确。

    【讨论】:

    • 天哪。我们会为此抛出更严重的错误吗?感谢您的发帖,为我节省了很多时间。
    • 由于模型中的错误属性而出现错误:[Column(TypeName = "decimal(9,4)")]
    • 谢谢您,先生,您成就了我的一天。
    • @Der_Meister 同样捏。当我在其中一个属性上提到属性 [Column("ToDoItem", TypeName = "nvarchar(4000)")] 时,我收到了这个错误。我遵循代码优先方法,其中 DB 事先不存在。当我将 nvarchar(4000) 更改为 nvarchar 时,它得到了纠正。令人惊讶的是,当我们提到 nvarchar 时,EF 仅使用 nvarchar(4000) 数据类型创建列。感谢 EF 团队提出这个神秘的错误。
    • 我刚刚发现 varchar 或 nvarchar 数据类型的长度需要作为一个单独的属性被提及,称为 StringLength。更有趣的是 [Column("ToDoItem", TypeName = "NVARCHAR(MAX)")] 有效。对于 MAX nvarchar 长度,您无需单独提及 stringLength 属性。
    【解决方案2】:

    我刚刚遇到了同样的问题。数据库向导中的 Code First 生成的列之一为 [Column(TypeName = "date")]

    调用.saveChanges() 得到Sequence contains no elements

    将定义的列更改为[DataType(DataType.DateTime)] 后,它按预期工作。

    【讨论】:

    • 我遇到了完全相同的问题,这很有帮助。这是一个可怕的例外。绝对没有用处!
    • &lt;Column(TypeName:="datetime")&gt;&lt;Column(TypeName:="datetime2")&gt; 按预期工作,仅供参考。
    【解决方案3】:

    我在添加迁移或更新数据库时也遇到了同样的错误。

    原因是我使用了错误的列类型

    [Column("ImageType", TypeName = "varchar(20)")]
    public string ImageType
    {
         get;
         set;
    }
    

    但是当我从 varchar 中删除 20 时,它开始为我工作

    [Column("ImageType", TypeName = "varchar")]
    public string ImageType
    {
        get;
        set;
    }
    

    【讨论】:

      【解决方案4】:

      对我来说,这条消息是因为对 Column 属性中的 TypeName 有误解。

      列属性:[列(字符串名称,属性:[Order = int],[TypeName = string])

      name:数据库表中列的名称。
      顺序:列的顺序,从零索引开始。 (可选)
      TypeName:列的数据类型。 (可选)

      此 TypeName 必须只是类型的名称,并且不得包含精度或比例或长度以及任何其他内容。比如下面会报错

      [Column(TypeName = "nvarchar(600)")]

      虽然低于 1 可以正常工作,但您可能希望有特定大小的列,为此一种方法是使用流式 API

      [Column(TypeName = "nvarchar")]

      【讨论】:

        【解决方案5】:

        如果列类型无效,实体框架会抛出此异常。例如:

        // This will throw an error. There is no such type name.
        [Column(TypeName = "Invalid")]
        public string Column1 { get; set; }
        
        // Works.
        [Column(TypeName = "varchar")]
        public string Column1 { get; set; }
        

        查看这些示例:

        【讨论】:

          【解决方案6】:

          是的。也抓住了我,因为在分心的时候,我把文字 long 放在那里作为 bigint 列 即HasColumnType("long")- 你能相信吗?!真是个小丑!

          生成器通常会正确地创建您的 EF 类,但如果您不能或不想使用一个,那么您可以使用带有一些静态字符串字段的静态类,以便您可以很好地对其进行智能感知:

          public static class DatabaseColumnTypes
          {
              /// <summary>
              /// Use this for 'boolean' values.
              /// </summary>
              public static string BitColumn = "bit";
          
              /// <summary>
              /// Use this for 'byte' values.
              /// </summary>
              public static string TinyIntColumn = "tinyint";
          
              /// <summary>
              /// Use this for 'long' values.
              /// </summary>
              public static string BigIntColumn = "bigint";
          
              /// <summary>
              /// Use this for 'string' values.
              /// </summary>
              public static string VarcharColumn = "varchar";
          
              // etc
          }
          

          现在你可以HasColumnType( DatabaseColumnTypes.BigIntColumn )

          我知道,我知道,这很懒惰,我应该记住这些类型,但我经常发现自己在 Stack Overflow 上查找它,这样可以节省时间……

          【讨论】:

            【解决方案7】:

            当我将 Member 模型重命名为 Student 并且在其他一些类中有一个导航属性时,我收到了相同的错误消息:

            public IList<Student> Members { get; set; }
            

            我把它改成了:

            public IList<Student> Students { get; set; }
            

            问题解决了!

            【讨论】:

              【解决方案8】:

              我在使用 Fluent API(作为派生自 EntityTypeConfiguration&lt;T&gt; 的类)定义 Table-Per-Type 继承时遇到此错误,并且错误地重新定义了已在基类配置中定义的字段(两者完全相同)。我使用的是 EntityFramework 6.2.0 nuget 包。

              【讨论】:

                【解决方案9】:

                我被这个抓住了,因为我引用了引用属性而不是 Id 属性。

                        var t = modelBuilder.Entity<CyDocument>();
                        t.HasIndex(b => b.DocTypeId);
                

                【讨论】:

                  【解决方案10】:

                  对我来说,当将课程项目切换为设置为启动项目

                  时,它会有所帮助

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-08-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-07-29
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多