序列不包含匹配元素 - 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 element
的 System.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)]
后,它按预期工作。
【讨论】:
我遇到了完全相同的问题,这很有帮助。这是一个可怕的例外。绝对没有用处!<Column(TypeName:="datetime")>
和 <Column(TypeName:="datetime2")>
按预期工作,仅供参考。【参考方案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<T>
的类)定义 Table-Per-Type 继承时遇到此错误,并且错误地重新定义了已在基类配置中定义的字段(两者完全相同)。我使用的是 EntityFramework 6.2.0 nuget 包。
【讨论】:
【参考方案9】:我被这个抓住了,因为我引用了引用属性而不是 Id 属性。
var t = modelBuilder.Entity<CyDocument>();
t.HasIndex(b => b.DocTypeId);
【讨论】:
【参考方案10】:对我来说,当将课程项目切换为设置为启动项目
时,它会有所帮助【讨论】:
以上是关于序列不包含匹配元素 - EntityFramework的主要内容,如果未能解决你的问题,请参考以下文章