ASP.NET Core迁移后报EntityEntry无plateno定义CS1061错误
错误原因
这个编译错误由EF Core和传统EF6的API差异,叠加原代码本身的逻辑缺陷共同导致:
- 旧版ASP.NET(.NET Framework)使用的EF6中,
DbSet<T>.Add()返回值就是传入的实体对象本身,所以链式属性赋值的写法在语法层面能通过,但原代码连续三次调用Add(),会导致同一个实体被重复加入上下文,本身就会触发重复插入的bug,属于历史遗留的隐藏问题。 - ASP.NET Core使用的EF Core重构了Add方法签名,返回值改为
EntityEntry<T>类型,这是EF Core用来跟踪实体状态的包装类,不包含你在Vehicle实体上自定义的plateno、description等业务属性,编译器自然会报找不到对应成员的CS1061错误。 - 原代码里
plateno = vehicle.plateno、description = vehicle.description是把实体的属性值赋给属性本身,属于完全无意义的冗余代码,没有保留必要。
修复方法
先给实体完成属性赋值,再单次调用Add方法把实体加入上下文,最后执行保存即可,修正后的代码如下:
// 设置实体属性 vehicle.status = 1; // 单次调用Add加入上下文 nobleappDbContext.vehicles.Add(vehicle); // 持久化到数据库 nobleappDbContext.SaveChanges(); return StatusCode(HttpStatusCode.Created);
如果你确实需要在调用Add之后再修改实体属性,需要通过EntityEntry的Entity属性拿到原始实体对象再操作,示例:
var vehicleEntry = nobleappDbContext.vehicles.Add(vehicle); vehicleEntry.Entity.status = 1;
这种写法属于多此一举,直接操作传入的vehicle实体可读性和性能都更好。
内容的提问来源于stack exchange,提问作者Sulfy
相关产品推荐
相关产品推荐

