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

本文关键字:适配器模式 属性 IDbSet 类的 DbContext | 更新日期: 2023-09-27 18:04:03

是否有一种方法可以使用这个答案中描述的方法在DbContext的DbSet属性的IDbSet上没有FindAsync()方法?

编辑:

链接的答案包含如何构建继承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。

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

在您的上下文中有常规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); } }
}