Иметь базовый класс сущности с реализацией CRUD и идентификатор первичного ключа, который может быть изменен реализующими его классами - PullRequest
1 голос
/ 10 февраля 2020

Чтобы не переписывать базовый c CRUD для каждого объекта, я хочу реализовать базовый класс объектов с базовыми операциями CRUD, которые могут быть реализованы любым другим объектом.

Проблема я использую Dapper для сопоставления с Dapper.Contrib, и первичные ключи моих таблиц базы данных никогда не называются Id - я не могу использовать Dapper mapper.

Я не могу найти способ иметь базовый класс для простого CRUD для каждого объекта.

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Здесь есть очень хорошая реализация без вклада шаблона репозитория c: https://itnext.io/generic-repository-pattern-using-dapper-bd48d9cd7ead

Эффективно вы создаете вставку следующим образом:

 public async Task InsertAsync(T t)
        {
            var insertQuery = GenerateInsertQuery();

            using (var connection = CreateConnection())
            {
                await connection.ExecuteAsync(insertQuery, t);
            }
        }

private string GenerateInsertQuery()
        {
            var insertQuery = new StringBuilder($"INSERT INTO {_tableName} ");

            insertQuery.Append("(");

            var properties = GenerateListOfProperties(GetProperties);
            properties.ForEach(prop => { insertQuery.Append($"[{prop}],"); });

            insertQuery
                .Remove(insertQuery.Length - 1, 1)
                .Append(") VALUES (");

            properties.ForEach(prop => { insertQuery.Append($"@{prop},"); });

            insertQuery
                .Remove(insertQuery.Length - 1, 1)
                .Append(")");

            return insertQuery.ToString();
        }
0 голосов
/ 26 февраля 2020

Несмотря на то, что @ 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] используется, когда идентификатор указан вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...