Шаблон адаптера для свойств 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); } }
}