实体核心中的IDbSet <t>在哪里

时间:2018-01-21 05:11:40

标签: c# .net-core entity-framework-core

enter image description here

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

它要求它必须是一个界面 那我现在该怎么办?

1 个答案:

答案 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中使用基本类型方法用于一些版本,并且没有听到任何关于真实场景的反馈,但这些方法也不起作用。