You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:32:30