将.NET Framework4.5转ASP.NET Core3.1时EF Core代码类型转换报错求助
EF Core 3.1 迁移中 Add 方法类型不匹配的解决办法
嗨,这个问题我太熟了——不少开发者从EF6(.NET Framework里的Entity Framework)转EF Core的时候都会踩这个坑!
问题根源
在EF6里,DbSet.Add()方法直接返回你添加的实体对象(也就是mytable类型),但EF Core做了设计调整:Add()方法返回的是EntityEntry<mytable>,这是一个包含实体跟踪信息的包装类,不是实体本身。所以你直接把它赋值给mytable类型的变量entry,就会触发类型转换错误。
两种可行的解决办法
办法1:通过EntityEntry的Entity属性获取实体
你可以接收Add()返回的EntityEntry对象,然后通过它的Entity属性拿到真正的实体:
var entry = db.mytable.FirstOrDefault(s => s.Name == "myname"); if (entry == null) { // 先接收EntityEntry对象 var trackedEntry = db.mytable.Add(new mytable() { Name = "myname" }); // 取出实体赋值给entry entry = trackedEntry.Entity; db.SaveChanges(); } int myNewID = entry.ID;
办法2:先创建实体,再添加到上下文(更简洁)
这种写法更直观,先实例化实体对象,再把它传给Add()方法,不需要处理EntityEntry:
var entry = db.mytable.FirstOrDefault(s => s.Name == "myname"); if (entry == null) { // 先创建实体 entry = new mytable() { Name = "myname" }; // 直接添加实体到上下文 db.mytable.Add(entry); db.SaveChanges(); } int myNewID = entry.ID;
额外小提示
如果你用的是EF Core 3.1及以上版本,也可以用异步的AddAsync()方法(适合IO密集场景),但注意它的返回值同样是EntityEntry<mytable>,处理逻辑和上面的办法1一致。
内容的提问来源于stack exchange,提问作者Pathead
相关产品推荐
相关产品推荐

