Дневник сертифицированного .NET разработчика. Заметки, советы, новости из мира .NET и C#.
Для связи: @SBenzenko
Поддержать канал:
- https://boosty.to/netdeveloperdiary
- https://patreon.com/user?u=52551826
- https://pay.cloudtips.ru/p/70df3b3b
Post #2806
2.27K
День 2330. #ЗаметкиНаПолях
Используем EF Core для Сохранения Дат в UTC и Отображения в Местном Времени. Окончание
Начало
А как насчёт применить конвертацию ко всем DateTime?
Если у вас есть несколько свойств DateTime, которые необходимо хранить как UTC в БД, добавление конвертера к каждому из свойств может занять много времени. Кроме того, в будущем при добавлении свойств DateTime необходимо помнить добавлять конвертер.
Однако можно применить конвертацию ко всем свойствам DateTime в DbContext. Для этого нужно переопределить метод OnModelCreating, создать новый экземпляр DateTimeUtcConverter и выполнить цикл по каждой сущности и каждому из её свойств, применяя DateTimeUtcConverter к свойствам типа DateTime:
Обнуляемое DateTime
Если у вас есть свойства DateTime, допускающие null, вы не сможете использовать DateTimeUtcConverter как есть. Нужно создать новый ValueConverter.
DateTimeUtcNullableConverter наследует от ValueConverter, но используя обнуляемый DateTime как для модели, так и для провайдера. Мы также проверяем, имеет ли значение дата при предоставлении параметров ExpressionFrom и ExpressionTo, и возвращаем исходный экземпляр, если его нет:
Для добавления конвертации ко всем свойствам типа DateTime? в DbContext, обновим перегрузку OnModelCreating, добавив новый конвертер:
Источник: https://www.roundthecode.com/dotnet-tutorials/use-ef-core-easily-save-dates-utc-show-local-time
Используем 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



