EF Core中实例化实体类报未实现IEnumerable错误的原因
原因说明
两种写法的差异属于C#基础语法范畴,和EF Core本身无关,报错来自第一种写法对对象初始化器的错误使用:
- 报错的第一种写法问题点:在
new User() { ... }的初始化大括号内,所有属性赋值前错误添加了u.前缀。C# 对象初始化器的语法规则为,大括号内部直接编写属性名 = 值的赋值语句即可,不需要引用实例变量——执行大括号内的逻辑时,对象还未完成实例化,变量u尚未完成赋值,此时写u.xxx = xxx会被编译器识别为集合初始化器的元素添加逻辑。集合初始化器要求目标类型必须实现System.Collections.IEnumerable接口,而User作为普通EF实体类未实现该接口,就会触发对应的报错。 - 可正常运行的第二种写法逻辑:属于最基础的分步实例化赋值流程,先通过
new User()调用构造函数创建实体实例,将实例引用赋值给变量u,之后逐行通过u.属性名的形式给实例属性赋值,完全符合C#语法规则,因此可以正常执行。
修正后的第一种写法
第一种写法只要删除大括号内所有属性赋值前的u.前缀,就是合法的对象初始化器写法,运行效果和第二种分步写法完全一致——对象初始化器本身就是分步赋值的语法糖,编译后生成的IL代码和第二种写法几乎没有区别:
var u = new BusinessEntities.Models.EF.User(){ FirstName = user.FirstName, LastName = user.LastName, Email = user.Email, EmployeeNo = user.EmployeeNumber, IsActive = user.IsActive, LastUpdatedDte = DateTime.Now, RegisteredDte = DateTime.Now }; db.User.Add(u);
补充说明:集合初始化器的典型用法为new List<string>(){"a","b","c"},大括号内编写的是要加入集合的元素,编译器会自动调用Add方法完成元素添加,这也是编译器识别到大括号内出现非属性直接赋值的语句时,会校验类型是否实现IEnumerable接口的原因。
内容的提问来源于stack exchange,提问作者Legion
相关产品推荐
相关产品推荐

