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); } } }