Entity Core中IDbSet缺失及RepositoryBase<T> Add方法报错求助
解决Entity Framework Core中IDbSet移除及Add方法返回值的问题
我来帮你搞定这个问题,这俩都是EF Core和旧版EF区别比较大的点,很容易踩坑:
核心问题分析
- IDbSet
已移除 :EF Core里确实没有IDbSet<T>这个接口了,直接用DbSet<T>就可以,它本身已经包含了你需要的所有数据操作方法。 - Add方法返回值变化:旧版EF里
DbSet.Add()返回的是实体本身,但EF Core里这个方法返回的是EntityEntry<T>对象(用来跟踪实体的状态变化),这就是你报错“无法隐式转换EntityEntry到T”的原因。
解决步骤
1. 保留DbSet的定义(无需替换为IDbSet)
你的代码里已经声明了private readonly DbSet<T> dbSet;,这完全没问题,直接保留就行,不用再找IDbSet的替代接口。
2. 修正Add方法的返回逻辑
有两种可选方案,根据你的需求选:
方案一:返回EntityEntry(更贴合EF Core的设计)
如果你不需要直接返回实体本身,可以把方法的返回类型改成EntityEntry<T>:
public virtual EntityEntry<T> Add(T entity) { return dbSet.Add(entity); }
方案二:返回实体对象(保持原有接口的返回类型)
如果你的IRepository<T>接口要求Add方法返回T,那可以从EntityEntry里取出实体:
public virtual T Add(T entity) { var entry = dbSet.Add(entity); return entry.Entity; }
修改后的完整代码示例
这里用方案二来保持原有接口的兼容性:
public abstract class RepositoryBase<T> : IRepository<T> where T : class { private ShopCoreDbContext dbContext; private readonly DbSet<T> dbSet; protected IDbFactory DbFactory { get; private set; } protected ShopCoreDbContext DbContext { get => dbContext ?? (dbContext = DbFactory.Init()); } protected RepositoryBase(IDbFactory dbFactory) { DbFactory = dbFactory; dbSet = DbContext.Set<T>(); } public virtual T Add(T entity) { var entry = dbSet.Add(entity); return entry.Entity; } }
额外提示
如果你的仓库接口里还有其他类似的方法(比如Update、Remove),也要注意它们的返回值变化,EF Core里这些方法同样返回EntityEntry<T>,处理方式和Add一致。
内容的提问来源于stack exchange,提问作者Thiện Sinh
相关产品推荐
相关产品推荐

