public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
private ShopCoreDbContext dbContext;
private readonly DbSet<T> dbSet; //here
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)
{
return dbSet.Add(entity); //err here
}
}
使用IDbSet没有任何反应。但实体核心中不再存在IDbSet接口。这是错误细节:
无法将Microsoft.entityframeworkcore.changetracking.entityentry类型隐式转换为T
它要求它必须是一个界面 那我现在该怎么办?
答案 0 :(得分:17)
解决您眼前的问题:
Add
方法不直接返回实体,而是返回包装器实体。使用其.Entity
属性来获取值(或返回传入的值):
public virtual T Add(T entity)
{
return dbSet.Add(entity).Entity;
}
关于IDbSet<T>
接口:实体框架核心没有IDbSet<T>
接口。
根据this GitHub issue,没有计划将其恢复,因为DbSet<T>
现在是一个抽象基类,可用于模拟测试或子类:
接口的问题是我们要么排除新成员,要么打破实现接口的人。对于那些编写自己的测试双精度(而不是使用模拟框架)的人来说,基类也稍微好一点,因为你只需要实现你实际使用的方法。
[...]
关闭,因为我们现在已经在EF6.x中使用基本类型方法用于一些版本,并且没有听到任何关于真实场景的反馈,但这些方法也不起作用。