У меня следующая ситуация.Проект, в базе данных которого есть все таблицы с первичным ключом с именем «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;
}
}
Я не хотел бы идти по этому пути необходимости кодировать то, что у меня уже есть в универсальном классе, и идея была бысохранить универсальный класс и иметь возможность решить эти объединения или отобразить их, если не по псевдониму, другим методом ...
Параметр для изменения имени ключей в базе данных не рассматривается какрешение.