【问题标题】:Using Interfaces With DbSet, Possible with EF Core?将接口与 DbSet 一起使用,是否可以与 EF Core 一起使用?
【发布时间】:2018-01-02 12:26:59
【问题描述】:

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

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

【问题讨论】:

  • 永远不可能,现在仍然不可能。

标签: c# entity-framework-6 ef-core-2.0


【解决方案1】:

这是可能的,但它需要一些技巧。 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 的接口,我错了吗?您正在使用接口 IDbSet 但问题是是否可以将接口用作 DbSet 的类型
  • 啊,你是对的。不过,从技术上讲,您可以像我在这里展示的那样包装它。您将需要一个真正的 DbSet 来实现类型,该类型将被传递到将公开接口的包装器中。然后它会间接使用该 DbSet 实现......但不确定它是否真的会为您带来那么多。
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多