Я создал базовую службу, которая запускает команды CRUD в базе данных с помощью EF Core, которую я хочу наследовать другим службам. Я пытаюсь выяснить, есть ли способ определить тип, запрашиваемый DbContext, на основе типов, передаваемых службе.
public class DbServiceBase<TDatabaseModel, TBusinessDisplayModel>
{
private readonly DbContext _context;
private readonly Mapper _mapper;
public DbServiceBase(DbContext context)
{
_context = context;
_mapper = new Mapper(MapperConfigurationGenerator.Invoke());
}
public async Task<List<TBusinessDisplayModel>> GetAll()
{
var dbResults = await _context.<TDatabaseModel>
.ToListAsync()
.ConfigureAwait(false);
return _mapper.Map<List<TBusinessDisplayModel>>(dbResults);
}
public async Task<TBusinessDisplayModel> GetById(long id)
{
var dbResult = await _context.<TDbModel>
.SingleAsync(x => x.Id == id)
.ConfigureAwait(false);
return _mapper.Map<TBusinessDisplayModel>(dbResult);
}
}
Свойства контекста базы данных, которые используются для доступа к моделям в базе данных, обычно реализуются следующим образом:
public DbSet<Post> Posts { get; set; }
EF автоматически заполнит эти свойства для вас объектами набора баз данных для этих типов сущностей, но вы также можете просто создать набор баз данных из контекста напрямую, вызвав DbContext.Set<T>. Поскольку этот метод уже является универсальным, вы можете использовать его для создания набора баз данных для типа, который вам нужен в вашей реализации:
public async Task<List<TBusinessDisplayModel>> GetAll()
{
var dbResults = await _context.Set<TDatabaseModel>()
.ToListAsync()
.ConfigureAwait(false);
return _mapper.Map<List<TBusinessDisplayModel>>(dbResults);
}
Спасибо! Это заставило меня указать в правильном направлении. Единственное, что мне нужно было сделать, это добавить ограничение: открытый класс DbServiceBase<TDatabaseModel, TBusinessDisplayModel>, где TDatabaseModel : class
DbContext
имеет метод Set
, который вы можете использовать для получения неуниверсального DbSet
, например:
dbSet = this.Set<SomeType>();
Вы должны сохранить этот набор баз данных в частном поле только для чтения вашей службы и использовать его для запроса данных.
Вы хотите вывести
DbContext
или, скорее,DbSet<TEntity>
внутриDbContext
?