FluentMap + Dapper + Join + Key Mapping Column Alias Проблема с отображением псевдонимов
У меня следующая ситуация. Проект, в базе данных которого есть все таблицы с первичным ключом с именем "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 всех сущности.
Ниже приведен пример запроса Dapper и Dommel из универсального класса CRUD:
public virtual T GetById(Int32 id)
{
try
{
using (var conn = CreateConnection())
{
return conn.Get<T>(id);
}
}
catch (Exception ex)
{
return null;
}
}
Я не хотел бы идти по этому пути необходимости кодировать то, что у меня уже есть, в универсальном классе, и идея состояла бы в том, чтобы сохранить универсальный класс и иметь способ решить эти объединения или отобразить их, если не с помощью псевдонима., другой метод...
Возможность изменить имя ключей в базе данных не рассматривается как решение.