Выполнять преобразования для всех дат и времени в get / set?

#c# #datetime #entity-framework-6

#c# #дата-время #entity-framework-6

Вопрос:

Сначала у меня есть база данных ASP.NET Проект MVC (C #) с EF6, который использует много объектов DateTime.

Они хранятся в базе данных как мой местный часовой пояс (TZ), однако некоторые пользователи находятся в разных TZ (также хранятся в базе данных), и я хотел бы представить им даты для их собственного TZ.

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

При загрузке представления TZ необходимо преобразовать в TZ пользователя.

При сохранении формы все даты в форме необходимо преобразовать обратно.

Функции, которые выполняют преобразования, сначала проверяют, требуется ли это в соответствии с записанным пользователем TZ.

Есть ли какой-нибудь способ, которым я могу поместить все объекты DateTime в преобразование при их получении и настройке или что-то в этом роде?

Комментарии:

1. ПРИМЕЧАНИЕ: не сохраняйте дату / время с часовым поясом. Преобразуйте его в UTC перед сохранением в базе данных, сохраните без информации о часовом поясе и преобразуйте в пользовательский часовой пояс перед отображением в пользовательском интерфейсе.

2. Я не разрабатывал базу данных, и в ней много исторических данных. Записи даты и времени не содержат информации о tz, но наблюдение за старым приложением, использующим базу данных, показало мне, что это мой собственный часовой пояс. Если бы я спроектировал базу данных, она хранилась бы в UTC. Вот почему я прямо упомянул, что в первую очередь это база данных.

Ответ №1:

Это во многом зависит от того, как вы получаете доступ к своей базе данных. Давайте рассмотрим пример Entity Framework

Там у вас есть преобразователи значений

Преобразователи значений позволяют преобразовывать значения свойств при чтении из базы данных или записи в нее. Это преобразование может быть из одного значения в другое того же типа (например, шифрование строк) или из значения одного типа в значение другого типа (например, преобразование значений enum в строки и из строк в базе данных).

Итак, в этом примере вы должны создать свой собственный DbContext с TZ помощью конструктора in и передать его конвертеру

 var converter = new LocalToTZConverter<DateTime>(timezone);

modelBuilder
    .Entity<DateEnabled>()
    .Property(e => e.Created)
    .HasConversion(converter);
 

Предполагая, что вы используете какой-то ORM, практически у каждого есть своя конверсия. Если это то, что вы реализуете сами, то вы бы обработали это в своих репозиториях и использовали бы в качестве практики кодирования, чтобы никогда не обращаться к данным напрямую (только через репозитории).

Комментарии:

1. Спасибо @athanasios-kataras Я использую Entity Framework, поэтому я посмотрю на этот вариант и посмотрю, как мне поступить 🙂

2. Я использую EF 6, но, к сожалению, это, похоже, доступно только с использованием EF Core. Не уверен, смогу ли я использовать этот метод на данном этапе!

3. Вы совершенно правы github.com/dotnet/ef6/issues/710 и команда не собирается его реализовывать.