EF CORE 2.1 HasConversion для всех свойств типа datetime - PullRequest
0 голосов
/ 06 июня 2018

Ранее я использовал DateTimeKindEntityMaterializerSource ( Git ) для преобразования всего DateTime в UTC при чтении сущностей, потому что значение по умолчанию было не указано.

С ядром EF 2.1 DateTimeKindEntityMaterializerSource больше не работает, но мы на самом деле можемсделать это

         builder
        .Entity<ESDataQuotation>()
        .Property(e => e.CreatedDate)
        .HasConversion(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));

Однако у меня есть много свойств DateTime, и я хотел бы, если есть способ сделать преобразование для всего свойства типа DateTime.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Просто думал, что смогу добавить свои два цента

Здесь открыта проблема для этого: https://github.com/aspnet/EntityFrameworkCore/issues/10784

Решение Ивана будет работать для простых типов, таких как DateTime и т. Д., Но онопроизойдет сбой при использовании пользовательских типов при вызове entityType.GetProperties(), это лучше описано в проблеме в ссылке выше.Чтобы заставить его работать с пользовательскими типами, вы должны будете использовать entityType.ClrType.GetProperties().

. Для универсального обходного пути вы можете использовать этот метод расширения:

public static class ModelBuilderExtensions
{
    public static ModelBuilder UseValueConverterForType<T>(this ModelBuilder modelBuilder, ValueConverter converter)
    {
        return modelBuilder.UseValueConverterForType(typeof(T), converter);
    }

    public static ModelBuilder UseValueConverterForType(this ModelBuilder modelBuilder, Type type, ValueConverter converter)
    {
        foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == type);
            foreach (var property in properties)
            {
                modelBuilder.Entity(entityType.Name).Property(property.Name)
                    .HasConversion(converter);
            }
        }

        return modelBuilder;
    }
}
0 голосов
/ 06 июня 2018

Выдержка из EF Core 2.1 Преобразование значений тема документации:

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

До этого вы можете использовать типичный цикл в конце переопределения OnModelCreating, где обнаруживаются все типы сущностей и свойства:

var dateTimeConverter = new ValueConverter<DateTime, DateTime>(
    v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Utc));

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    foreach (var property in entityType.GetProperties())
    {
        if (property.ClrType == typeof(DateTime) || property.ClrType == typeof(DateTime?))
            property.SetValueConverter(dateTimeConverter);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...