序列不包含匹配元素 - EntityFramework

Posted

技术标签:

【中文标题】序列不包含匹配元素 - EntityFramework【英文标题】:Sequence contains no matching element - 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 服务链接。

【问题讨论】:

【参考方案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; 

查看这些示例:

Example 1 Example 2 cmets 中的其他示例。

【讨论】:

【参考方案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】:

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

时,它会有所帮助

【讨论】:

以上是关于序列不包含匹配元素 - EntityFramework的主要内容,如果未能解决你的问题,请参考以下文章

PetaPoco POCO 生成失败,序列包含多个匹配元素

Sequence包含多个匹配元素

如何在数组元素中搜索哈希键中的匹配项

将元组与元组序列中的某些元素匹配

CodeForces 224C Bracket Sequence(栈)

二分图匹配 双栈排序