Несмотря на то, что @ Athanas ios Kataras ответ работает, я по-прежнему использовал расширение Dapper.contrib, потому что, на мой взгляд, это более понятно.
Я пошел по пути использования Dapper .contrib и создание класса базового репозитория, который затем использовался любым другим репозиторием. Первичные ключи (идентификаторы) обрабатывались с помощью аннотаций данных, которые Dapper предоставляет для сущностей ([Key], [ExplicitKey]).
Пример некоторого класса репозитория, реализующего Базовый репозиторий:
public class ACRepository : BaseRepository<ACEntity>, IACRepository
{
private readonly IDbConnection _dbConnection;
public ACRepository(IDbConnection _dbconn) : base(_dbconn)
{
_dbConnection = _dbconn;
}
// Some other methods that require more complicated queries
}
Базовый класс репозитория:
using Dapper.Contrib.Extensions;
public class BaseRepository<T> : IBaseRepository<T> where T : class
{
private readonly IDbConnection _dbConnection;
public BaseRepository(IDbConnection _dbconn)
{
_dbConnection = _dbconn;
}
public async Task Add(T entity)
{
var result = await _dbConnection.InsertAsync(entity);
}
public async Task<bool> Delete(T entity)
{
return await _dbConnection.DeleteAsync(entity);
}
public async Task<bool> Update(T entity)
{
return await _dbConnection.UpdateAsync(entity);
}
public async Task<T> GetById(object id)
{
return await _dbConnection.GetAsync<T>(id);
}
public async Task<IEnumerable<T>> GetAll()
{
return await _dbConnection.GetAllAsync<T>();
}
}
Объект:
using Dapper.Contrib.Extensions;
[Table("table_name")]
public class SquawkRegisterPMEEntity
{
[ExplicitKey]
public string SomeKey { get; set; }
[Key]
public int SomeOtherKey{ get; set; }
public string SomeProperty { get; set; }
public string SomeProperty1 { get; set; }
}
[Key ] используется, если значение генерируется базой данных.
[ExplicitKey] используется, когда идентификатор указан вручную.