TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2806 2.27K
День 2330. #ЗаметкиНаПолях
Используем EF Core для Сохранения Дат в UTC и Отображения в Местном Времени. Окончание

Начало

А как насчёт применить конвертацию ко всем DateTime?
Если у вас есть несколько свойств DateTime, которые необходимо хранить как UTC в БД, добавление конвертера к каждому из свойств может занять много времени. Кроме того, в будущем при добавлении свойств DateTime необходимо помнить добавлять конвертер.

Однако можно применить конвертацию ко всем свойствам DateTime в DbContext. Для этого нужно переопределить метод OnModelCreating, создать новый экземпляр DateTimeUtcConverter и выполнить цикл по каждой сущности и каждому из её свойств, применяя DateTimeUtcConverter к свойствам типа DateTime:
public class EfCoreDateTimeDbContext
: DbContext
{
…
protected override void OnModelCreating(
ModelBuilder mb)
{
…
var converter = new DateTimeUtcConverter();

foreach (var t in mb.Model.GetEntityTypes())
{
foreach (var p in t.GetProperties())
{
if (p.ClrType == typeof(DateTime))
p.SetValueConverter(сonverter);
}
}

base.OnModelCreating(mb);
}
}


Обнуляемое DateTime
Если у вас есть свойства DateTime, допускающие null, вы не сможете использовать DateTimeUtcConverter как есть. Нужно создать новый ValueConverter.

DateTimeUtcNullableConverter наследует от ValueConverter, но используя обнуляемый DateTime как для модели, так и для провайдера. Мы также проверяем, имеет ли значение дата при предоставлении параметров ExpressionFrom и ExpressionTo, и возвращаем исходный экземпляр, если его нет:
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

public class DateTimeUtcNullableConverter
: ValueConverter<DateTime?, DateTime?>
{
public DateTimeUtcNullableConverter() : base(
d => d.HasValue ? d.Value.ToUniversalTime() : d,
d => d.HasValue ? DateTime
.SpecifyKind(d.Value, DateTimeKind.Utc)
.ToLocalTime() : d)
{}
}

Для добавления конвертации ко всем свойствам типа DateTime? в DbContext, обновим перегрузку OnModelCreating, добавив новый конвертер:
public class EfCoreDateTimeDbContext
: DbContext
{
…
protected override void OnModelCreating(
ModelBuilder mb)
{
…
var converter = new DateTimeUtcConverter();
var nullableConverter =
new DateTimeUtcNullableConverter();

foreach (var t in mb.Model.GetEntityTypes())
{
foreach (var p in t.GetProperties())
{
if (p.ClrType == typeof(DateTime))
p.SetValueConverter(сonverter);

if (p.ClrType == typeof(DateTime?))
p.SetValueConverter(nullableConverter);
}
}

base.OnModelCreating(mb);
}
}


Источник: https://www.roundthecode.com/dotnet-tutorials/use-ef-core-easily-save-dates-utc-show-local-time
  • 👍 9
More from @netdeveloperdiary
  1. Oct 2, 2026День 2802. #Карьера #Юмор Секреты Программирования, Известные Только Легендам Ещё один пос…
  2. Oct 1, 2026Post #3357
  3. Sep 30, 2026Post #3356
  4. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  5. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  6. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →