FluentMap + Dapper + Join + Key Mapping Column Alias ​​Проблема с отображением псевдонимов - PullRequest
0 голосов
/ 31 января 2019

У меня следующая ситуация.Проект, в базе данных которого есть все таблицы с первичным ключом с именем «id».При выполнении объединений для загрузки подклассов я использую что-то вроде следующего кода:

Пример запроса объединений:

var sql1 = @ "SELECT
                                        t.id AS id_ticket_entity,
                                        t.statusticketid,
                                        t.usuarioclienteid,
                                        t.categoriaid,
                                        t.classification,
                                        title,
                                        t.description,
                                        t.data_hora_inicial,
                                        t.data_hora_alteracao,
                                        CASE
                                            WHEN t.data_hora_ultima_messagem IS NULL THEN t.data_hora_inicial
                                            WHEN t.data_hora_ultima_mensagem IS NOT NULL THEN t.data_hora_ultima_mensagem
                                        END AS date_host_message_message,
                                        t.data_time_final,
                                        ct.id AS id_categoria_entity,
                                        ct.name,
                                        cl.id AS id_classificacao_entity,
                                        cl.name,
                                        st.id AS id_status_ticket_entity,
                                        st.name,
                                        st.use,
                                        it's open,
                                        it's open,
                                        uc.id AS user_entity_entity,
                                        ucl.clienteid,
                                        uc.name,
                                        uc.email,
                                        uc.phonephone,
                                        uc.cellphone,
                                        uc.copy,
                                        uc.provisorio,
                                        uactive,
                                        c.id AS id_cliente_entity,
                                        c.name
                                FROM dbo.Ticket t
                                LEFT JOIN dbo.Category ct ON t.categoriaid = ct.id
                                LEFT JOIN dbo.classification cl ON t.classificationid = cl.id
                                LEFT JOIN dbo.Status_Ticket st ON t.statusticketid = st.id
                                LEFT JOIN dbo.Usuario_Customer uc ON t.usuarioclienteid = uc.id
                                LEFT JOIN dbo.Customer c ON uc.clienteid = c.id
                                WHERE t.id = "+ idTicket;

Пример выполнения вышеуказанного запроса:

result1 = conn.Query <Ticket, Category, Classification, StatusTicket, CustomerCustomer, Client, Ticket> (sql1,
                                    map: (ticket, category, rating, status, user, client) =>
                                    {
                                        ticket.Category = category;
                                        ticket.Classification = classification;
                                        ticket.StatusTicket = status;
                                        ticket.UsuarioCustomer = user;
                                        ticket.UsuarioCliente.Cliente = customer;
    
                                        return ticket;
                                    },
                                    splitOn: "id_categoria_entity, id_classificacao_entity, id_status_ticket_entity, id_usario_cliente_entity, id_cliente_entity"). SingleOrDefault ();

Вот FluentMap, используемый для некоторых из этих сущностей:

public TicketMapping()
{
    ToTable("Ticket");
    Map(m => m.Id).ToColumn("id_ticket_entity").IsKey().IsIdentity();
    Map(m => m.IdStatusTicket).ToColumn("statusticketid");
    Map(m => m.IdUsuarioCliente).ToColumn("usuarioclienteid");
    Map(m => m.IdCategoria).ToColumn("categoriaid");
    Map(m => m.IdClassificacao).ToColumn("classificacaoid");
    Map(m => m.Titulo).ToColumn("titulo");
    Map(m => m.Descricao).ToColumn("descricao");
    Map(m => m.DataHoraInicial).ToColumn("data_hora_inicial");
    Map(m => m.DataHoraAlteracao).ToColumn("data_hora_alteracao");
    Map(m => m.DataHoraUltimaMensagem).ToColumn("data_hora_ultima_mensagem");
    Map(m => m.DataHoraFinal).ToColumn("data_hora_final");
    Map(m => m.Categoria).Ignore();
    Map(m => m.Classificacao).Ignore();
    Map(m => m.StatusTicket).Ignore();
    Map(m => m.UsuarioCliente).Ignore();
}

public CategoriaMapping()
{
    ToTable("Categoria");
    Map(m => m.Id).ToColumn("id_categoria_entity").IsKey().IsIdentity();
    Map(m => m.Nome).ToColumn("nome");
}


public ClassificacaoMapping()
{
   ToTable("Classificacao");
   Map(m => m.Id).ToColumn("id_classificacao_entity").IsKey().IsIdentity();
   Map(m => m.Nome).ToColumn("nome");
}

Как видно, я использую псевдонимы для всех первичных ключей, поэтомуЯ могу сделать расположение клавиш в выбранных полях и позволить Dapper правильно загружать подклассы.

Пока что, очевидно, все работает, но проблема в том, что у меня есть универсальный класс, который обслуживает всерепозитории для выполнения базового CRUD, и из-за этого сопоставления ALIAS мой универсальный класс перестает работать, потому что я не могу выполнить поиск напрямую, потому что не могу сопоставить исходный столбец «id» сущности, а толькоПсевдоним ключа, я теряю удобство наличия этого универсального класса, заставляя меня кодировать почти все CRUD всех сущностей.

Ниже приведен примерзапрос Даппера и Доммеля из универсального класса CRUD:

public virtual T GetById(Int32 id)
{
    try
    {
        using (var conn = CreateConnection())
        {
            return conn.Get<T>(id);
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

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

Параметр для изменения имени ключей в базе данных не рассматривается какрешение.

...