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 Однако в вашем источнике данных... Кажется ненужным и слишком сложным.

"Всегда пишите свой код, как если бы следующий человек, который поддерживал его, был психопатом с топором, который знает ваш домашний адрес".

Другие вопросы по тегам