有没有办法针对DbContext的DbSet属性使用此答案No FindAsync() method on IDbSet中描述的方法?
编辑:
链接的答案包含有关如何构建从IDbSet继承的接口以及如何添加对DbSet类的SearchAsync方法的支持的描述。我了解Keith Payne编写的所有内容,但不知道如何在DbContext中使用它。
例如,我有一个DbContext,看起来像这样:
public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
如何使用MyDbSet(答案中描述的类)或类似的类代替DbSet?
public class MyContext : DbContext
{
public MyDbSet<Customer> Customers { get; set; }
}
现在的问题是,实体框架似乎只为IDbSet或DbSet类型的属性生成表。
最佳答案
您在上下文中具有常规DbSet并创建添加所需接口的适配器。
public interface IAsyncDbSet<T> : IDbSet<T>
where T : class
{
Task<T> FindAsync(params Object[] keyValues);
}
public sealed class DbSetAdapter<T> : IAsyncDbSet<T>, IDbSet<T>
where T : class
{
private readonly DbSet<T> _innerDbSet;
public DbSetAdapter(DbSet<T> innerDbSet)
{
_innerDbSet = innerDbSet;
}
public Task<T> 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<T>
扩展方法public class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public IAsyncDbSet<Customer> CustomersAsync { get { return new DbSetAdapter<Customer>(Customers); } }
}
关于c# - DbContext类的IDbSet属性的适配器模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23730949/