Dapper: возможно ли настроить отображение типа определенного поля определенного типа?
Допустим, у меня есть это User
учебный класс:
public class User
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime DateCreated { get; set; }
public DateTime LastLogin { get; set; }
}
Который я хочу сопоставить со следующей таблицей:
CREATE TABLE "user" (
"ID" int(11) NOT NULL AUTO_INCREMENT,
"FirstName" varchar(45) DEFAULT NULL,
"LastName" varchar(45) DEFAULT NULL,
"Email" varchar(255) NOT NULL,
"DateCreated" int(11) NOT NULL,
"LastLogin" int(11) NOT NULL,
PRIMARY KEY ("ID")
)
Или проще говоря: я хочу сохранить свойства DateTime как поля int в базе данных. Тем не менее, это имеет место для этого класса / таблицы. Другие классы / таблицы могут отображаться по-другому. Я думал о чем-то вроде пользовательской функции преобразования в сочетании с типом или картой элемента.
Можно ли достичь этого с помощью Dapper, и если да, то как?
4 ответа
Суть в том, что Dapper не поддерживает это по замыслу. Одним из основных принципов проектирования является отображение 1:1 между таблицей и объектом, за исключением сопоставления имен столбцов и имен свойств.
В конце концов, я решил объединить Dapper с AutoMapper, которым мы все равно активно пользуемся. В наших Dapper DAO в сложных случаях мы используем объект сущности, отдельный от объекта домена, и отображаем их между собой. По сути, нетривиальное отображение между доменом и таблицей становится простым вопросом отображения объекта на объект.
Теперь это должно быть возможно с помощью пользовательских SqlMapper.TypeHandler
, Смотрите этот пример в модульных тестах. Недостатком является то, что он применяет обработку пользовательских типов ко всем полям одного типа. В вашем случае все свойства DateTime будут оцениваться через обработчик типов.
Вероятно, вы можете использовать новый SqlMapper.SetTypeMap
метод для достижения этого. См. /questions/21199661/vruchnuyu-sopostavte-imena-stolbtsov-so-svojstvami-klassa/21199683#21199683 для получения дополнительной информации.
Насколько мне известно, Dapper в настоящее время не поддерживает такие преобразования. Вы можете использовать сохраненные процы в Dapper, и сделать так, чтобы он сделал преобразование за вас. Вы также можете убедиться, что данные / преобразование выполнены перед передачей объекта в Dapper.
Я сильно сомневаюсь, почему вы выбрали int
даты против DateTime
Однако в вашем источнике данных... Кажется ненужным и слишком сложным.
"Всегда пишите свой код, как если бы следующий человек, который поддерживал его, был психопатом с топором, который знает ваш домашний адрес".