将接口与 DbSet 一起使用,可能与 EF Core 一起使用?
Using Interfaces With DbSet, Possible with EF Core?
Back in EF 4 不可能。是否可以在 EF6 或 EF Core 中使用带有 DbSet
的接口?
public class LfSp3Ctx : DbContext, ILfSp3Ctx
{
public DbSet<ILfSp3Project> ProjectSE { get; set; }
}
这是可能的,但需要一些技巧。 EF 只会直接实例化 DbSet 类型。因此,您必须创建自己的接口,wraps/exposes 您想要的所有 DbSet 方法,实际实现在其构造函数中采用 DbSet 实例。然后在 DbContext class 上,你必须做这样的事情:
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);
}
像这样。我的有点特定于我当时试图实现的实现。 :)
Back in EF 4 不可能。是否可以在 EF6 或 EF Core 中使用带有 DbSet
的接口?
public class LfSp3Ctx : DbContext, ILfSp3Ctx
{
public DbSet<ILfSp3Project> ProjectSE { get; set; }
}
这是可能的,但需要一些技巧。 EF 只会直接实例化 DbSet 类型。因此,您必须创建自己的接口,wraps/exposes 您想要的所有 DbSet 方法,实际实现在其构造函数中采用 DbSet 实例。然后在 DbContext class 上,你必须做这样的事情:
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);
}
像这样。我的有点特定于我当时试图实现的实现。 :)