2

有没有办法使用此答案中描述的方法No FindAsync() method on IDbSet for DbSet properties of a DbContext?

编辑:

链接的答案包含如何构建从 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; }
}

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

4

1 回答 1

0

您的上下文中有常规的 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); } }
}
于 2014-08-22T09:06:41.570 回答