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

时间:2014-05-19 06:25:46

标签: c# entity-framework adapter dbcontext dbset

有没有办法将此答案No FindAsync() method on IDbSet中描述的方法用于DbContext的DbSet属性?

修改

链接的答案包含如何构建继承自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类型的属性生成表。

1 个答案:

答案 0 :(得分: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); } }
}