Шаблон адаптера для свойств IDbSet класса DbContext

Есть ли способ использовать метод, описанный в этом ответе Нет метода FindAsync() в IDbSet для свойств DbSet DbContext?

Редактировать:

Связанный ответ содержит описание того, как создать интерфейс, унаследованный от IDbSet, и добавить поддержку метода SearchAsync класса DbSet. Я понимаю все, что написал Кит Пейн, но я не знаю, как я могу использовать это в 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 ответ

У вас есть обычный 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); } }
}
Другие вопросы по тегам