使用带有DbSet的接口,可以使用EF Core吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用带有DbSet的接口,可以使用EF Core吗?相关的知识,希望对你有一定的参考价值。

Back in EF 4这是不可能的。是否可以在EF6或EF Core中使用DBSet接口?

public class LfSp3Ctx : DbContext, ILfSp3Ctx
{
    public DbSet<ILfSp3Project> ProjectSE { get; set; }
}
答案

这是可能的,但它需要一些技巧。 EF将仅直接实例化DbSet类型。因此,您必须创建自己的接口来包装/公开您想要的所有DbSet方法,并且实际实现在其构造函数中使用DbSet实例。然后在DbContext类中,你必须做这样的事情:

IDbSet<DigimonEntity> DigimonRepository => new DbSetRepository<DigimonEntity>(this.Digimons);

DbSet<DigimonEntity> Digimons { get; set; }

public class DbSetRepository<T> : IDbSet<T> where T : class
{
    private readonly DbSet<T> _set;
    public DbSetRepository(DbSet<T> set) => _set = set;

    public Type ElementType => ((IQueryable<T>)_set).ElementType;
    public Expression Expression => ((IQueryable<T>)_set).Expression;
    public IQueryProvider Provider => ((IQueryable<T>)_set).Provider;
    public IEnumerator<T> GetEnumerator() => ((IEnumerable<T>)_set).GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<T>)_set).GetEnumerator();

    void IDataStoreRepositoryWrite<T>.Add(T entity) => _set.Add(entity);
    void IDataStoreRepositoryWrite<T>.Update(T entity) => _set.Update(entity);
    void IDataStoreRepositoryWrite<T>.Delete(T entity) => _set.Remove(entity);

    Task IDataStoreRepositoryWrite<T>.AddAsync(T entity, CancellationToken token) => _set.AddAsync(entity, token);
}

像这样的东西。我的具体实现是我当时试图实现的。 :)

以上是关于使用带有DbSet的接口,可以使用EF Core吗?的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 2.0 中的动态访问表

使用 linq 计算 EF Core 中的平均评分

使用 EF DbSet 对数据进行排序 [关闭]

EF Core 查询优化:我可以在 List<string> 上使用 Contains 吗?

EF 6不同的DbSet名称来自它所持有的类

EF Core对象关系映射多种方法