TG Telegram Group & Channel
.NET Разработчик | United States America (US)
Create: Update:

День 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

День 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


>>Click here to continue<<

.NET Разработчик




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)