代码之家  ›  专栏  ›  技术社区  ›  Abhijeet

使用DbSet接口,可能使用EF Core?

  •  6
  • Abhijeet  · 技术社区  · 7 年前

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

    public class LfSp3Ctx : DbContext, ILfSp3Ctx
    {
        public DbSet<ILfSp3Project> ProjectSE { get; set; }
    }
    
    1 回复  |  直到 3 年前
        1
  •  6
  •   Daniel Lorenz    7 年前

    这是可能的,但需要一些技巧。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);
    }
    

    像这样的。我的有点特定于我当时试图实现的实现。:)