繁体   English   中英

序列不包含匹配元素 - EntityFramework

[英]Sequence contains no matching element - EntityFramework

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

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

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

另一方面,我在同一个项目上创建了一个 WCF 服务,并在 .svc 文件中调用 function GetAll(),如下所示:

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

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

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

我有一个错误,我得到一个System.InvalidOperationException消息,其中消息Sequence contains no matching element因为在表配置.HasColumnType()不正确的字符串值传递给.HasColumnType()

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

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

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

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

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

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

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

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

对我而言,此消息是由于对Column属性中的TypeName的误解。

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

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

此TypeName必须仅是类型的名称,并且不得包含精度,小数位数或长度以及任何其他内容。 例如以下将导致错误

[Column(TypeName =“ nvarchar(600)”)]

虽然下面的方法可以正常工作,但是您可能希望具有特定的列大小,并且其中一种方法是使用流畅的API

[Column(TypeName =“ nvarchar”)]

如果列类型无效,则实体框架将引发此异常。 例如:

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

请参阅以下示例:

对。 抓住了我也因为分心的时刻,我把文本那里BIGINT列即HasColumnType("long") -你能相信吗? 真是个小丑!

生成器通常会正确地创建EF类,但是如果您不能使用或不想使用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上查找它,这样可以节省时间。

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

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

我将其更改为:

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

问题解决了!

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

我之所以陷入这一困境,是因为我引用了引用属性而不是Id属性。

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

我遇到了相同的异常System.InvalidOperationException ,消息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;
}

对我而言,当将班级项目切换为“ 设为启动项目”时,它对您有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM