序列中不包含匹配的元素 - EntityFramework

25

我正在使用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();
}

该项目正在构建中。我甚至检查了配置,它在正确的数据库中。然而,应该创建的数据库和表并不存在,并出现错误“序列中不包含匹配的元素”。

如果这个让您感到困惑,您能否给我一些使用Code First Entity Framework的WCF服务链接?

11个回答

64

我遇到了一个问题,代码抛出了System.InvalidOperationException异常并显示消息:Sequence contains no matching element,因为我在表格配置中传递了错误的字符串值给.HasColumnType()方法。


12
天啊,难道我们还能遇到更糟糕的错误吗?谢谢你的发帖,节省了我很多时间。 - BlackICE
5
我出现错误是因为模型里有一个错误的属性:[Column(TypeName = "decimal(9,4)")]。我会修正它。 - Der_Meister
3
谢谢您,先生。您让我今天过得非常愉快。 - Carlos Araujo
1
@Der_Meister 同感。我在一个属性上提到了属性[Column("ToDoItem", TypeName = "nvarchar(4000)")]时遇到了这个错误。我正在遵循代码优先的方法,其中DB之前不存在。当我将nvarchar(4000)更改为nvarchar时,它得到了纠正。令人惊讶的是,当我们提到nvarchar时,EF仍然会创建带有nvarchar(4000)数据类型的列。感谢EF团队提出了这个神秘的错误。 - RBT
1
当你找到这个答案并且它能拯救你的一天时,你想点赞它,然后发现你过去已经点过赞了... 扶额 - Jules
显示剩余4条评论

11

我刚刚遇到了同样的问题。来自数据库向代码的向导将其中一个列生成为[Column(TypeName = "date")]

调用.saveChanges()会导致Sequence contains no elements

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


1
我遇到了完全相同的问题,这个有帮助。那是一个可怕的异常。绝对没有任何用处! - SoftwareSavant
<Column(TypeName:="datetime")><Column(TypeName:="datetime2")> 的使用效果如预期,仅供参考。 - MrGadget

7

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

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

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

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

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

3
对我来说,这个消息是由于Column属性中的TypeName误解引起的。
Column属性:[Column(string name,Properties:[Order = int],[TypeName = string])]
name:数据库表中列的名称。 Order:列的顺序,从零索引开始。(可选) TypeName:列的数据类型。(可选)
此TypeName必须仅为类型名称,不得包括精度、比例或长度以及任何其他内容。例如,以下内容将导致错误:
[Column(TypeName =“nvarchar(600)”)]
而下面的内容将正常工作,但您可能希望具有特定的列大小,为此一种方法是使用流畅的API:
[Column(TypeName =“nvarchar”)]

2

如果列类型无效,Entity Framework会抛出此异常。例如:

// 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; }

请看以下示例:


1

是的。在分神的时候,我将文本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 上查找它,这样可以节省时间...

0
我遇到了相同的异常,异常信息为“Sequence contains no matching element”,这是在Entity Framework 6.0.0中发生的。当我升级到Entity Framework 6.4.4时,我遇到了一个带有明确信息的异常:“Additional information: The store type 'VARCHAR2(10)' could not be found in the OracleEFProvider provider manifest”。
[Column("SCOPE_ID", TypeName = "varchar(10)")]
public string ScopeId
{
     get;
     set;
}

我把我的代码改成了如下,通过移除TypeName

[Column("SCOPE_ID"]
public string ScopeId
{
    get;
    set;
}

0

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


0

我被这个问题困扰了,因为我引用了引用属性而不是ID属性。

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

0

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

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

我把它改成了:

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

问题已经解决!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接