Dapper – как применить преобразование к выбранным полям объекта? ⇐ C#
-
Anonymous
Dapper – как применить преобразование к выбранным полям объекта?
Проблема, которую я пытаюсь решить, довольно проста: мне нужно убедиться, что мои временные метки хранятся в базе данных как 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 предоставляет для настройки сопоставлений?
Проблема, которую я пытаюсь решить, довольно проста: мне нужно убедиться, что мои временные метки хранятся в базе данных как 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 предоставляет для настройки сопоставлений?
Мобильная версия