DbContext类的IDbSet属性的适配器模式

有没有办法使用此答案中描述的方法IDbSet上没有FindAsync()方法DbContext的DbSet属性?

编辑:

链接的答案包含如何构建inheritance自IDbSet的接口以及添加对DbSet类的SearchAsync方法的支持的描述。 我理解Keith Payne编写的所有内容,但我不知道如何在DbContext中使用它。

例如,我有一个看起来像这样的DbContext:

public class MyContext : DbContext { public DbSet Customers { get; set; } } 

我如何使用MyDbSet(答案中描述的类)或类似的类,而不是DbSet?

 public class MyContext : DbContext { public MyDbSet Customers { get; set; } } 

问题是,Entity Framework似乎只为IDbSet或DbSet类型的属性生成表。

您在上下文中有常规DbSet并创建添加所请求接口的适配器。

 public interface IAsyncDbSet : IDbSet where T : class { Task FindAsync(params Object[] keyValues); } public sealed class DbSetAdapter : IAsyncDbSet, IDbSet where T : class { private readonly DbSet _innerDbSet; public DbSetAdapter(DbSet innerDbSet) { _innerDbSet = innerDbSet; } public Task FindAsync(params object[] keyValues) { return _innerDbSet.FindAsync(keyValues); } //Here implement each method so they call _innerDbSet like I did for FindAsync } 

现在,您可以在需要时创建DbSetAdapater并获取IAsyncDbSet。 您可以复制您的属性,因为EF似乎忽略它们或将ToAsyncDbSet()扩展方法添加到IDbSet

 public class MyContext : DbContext { public DbSet Customers { get; set; } public IAsyncDbSet CustomersAsync { get { return new DbSetAdapter(Customers); } } } 
Interesting Posts