Dapper – как применить преобразование к выбранным полям объекта?C#

Место общения программистов C#
Ответить
Anonymous
 Dapper – как применить преобразование к выбранным полям объекта?

Сообщение Anonymous »


Проблема, которую я пытаюсь решить, довольно проста: мне нужно убедиться, что мои временные метки хранятся в базе данных как UTC. Я использую DateTime в своих объектах модели, который сопоставляется со столбцом timespamp в базе данных Postgres.

Я бы хотел сделать 2 вещи:
[*]
Когда значение сохраняется в базе данных, я хочу проверить поле DateTime.Kind и выдать сообщение, если оно не UTC. Это поможет мне обнаружить ошибки, если я попытаюсь передать время, отличное от UTC, в поле метки времени. Я не хочу делать никаких преобразований, просто утверждаю.
[*]
При загрузке из БД мне нужно, чтобы эти экземпляры DateTime выводились с DateTime.Kind, установленным в UTC, чтобы остальная часть моего приложения могла распознать их UTC и при необходимости конвертируйте в местное или другое.

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

Я пробовал это:

публичный класс UtcTimestampMapper: SqlMapper.TypeHandler { общедоступное переопределение void SetValue (параметр IDbDataParameter, DateTime dt) { если (dt.Kind == DateTimeKind.Utc) параметр.Значение = ДТ; еще throw new InvalidOperationException("Ожидается временная метка UTC"); } общедоступное переопределение DateTime Parse (значение объекта) { вернуть DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc); } } У этого решения есть две проблемы:
[*]
Это применимо ко всем значениям DateTime. С помощью SetValue я могу проделать трюк, проверив имя столбца в IDbDataParameter, возможно... Но метод Parse просто получает голое значение, есть Я ничего не могу сделать, чтобы определить, куда он идет.
[*]
Метод SetValue вообще не будет вызываться, пока я не удалю стандартный обработчик для DateTime. Подробности см. в этом ответе SO: Dapper TypeHandler.SetValue() не вызывается. Опять же, если я заменяю обработчик, я заменяю его глобально, нет возможности выбрать, где он применяется.

Итак, есть ли способ решить мою проблему с помощью средств, которые Dapper предоставляет для настройки сопоставлений?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»