Преобразование значений в сериализацию JSON не отслеживает изменения с помощью EF Core - PullRequest
0 голосов
/ 29 октября 2018

Я использую преобразование EF Core.

https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions

Я написал преобразователь сериализатора JSON следующим образом:

private static ValueConverter<T, String> JsonValueConverter<T>()
{
    ValueConverter<T, String> jsonConverter = new ValueConverter<T, String>(
        v => JsonConvert.SerializeObject(v),
        v => JsonConvert.DeserializeObject<T>(v));
    return jsonConverter;
}

Реализовано в приложении с:

protected override void OnModelCreating(ModelBuilder mb)
{    
   ...
   mb.Entity<MyObject>()
     .Property(p => p.MySerializableObject)
     .HasConversion(JsonValueConverter<MySerializableObject>());
   ...
}

Работает.

Однако, когда вы вносите изменения в свойство внутри сериализованного объекта, отслеживание изменений EF Core не регистрирует изменения в MySerializableObject.

Я предполагаю, что есть какой-то способ заставить это на уровне объекта. Я пытался внедрить IEqualityComparer на MySerializableObject, но отслеживание изменений не начало работать.

1 Ответ

0 голосов
/ 29 октября 2018

Мне удалось включить отслеживание изменений, добавив ValueConverter и ValueComparer к метаданным свойства, однако мой компаратор, вероятно, очень неэффективен. Если у кого-то есть предложения по настройке производительности для этого, это будет высоко ценится.

mb.Entity<MyObject>().Property(p => .MySerializableObject).HasJsonConversion();

С новым методом расширения HasJsonConversion

public static class ValueConversionExtensions
{
    public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder)
    {           
        ValueConverter<T, String> converter = new ValueConverter<T, String>(
            v => JsonConvert.SerializeObject(v),
            v => JsonConvert.DeserializeObject<T>(v));

        ValueComparer<T> comparer = new ValueComparer<T>(
            (l, r) => JsonConvert.SerializeObject(l) == JsonConvert.SerializeObject(r),
            v => v == null ? 0 : JsonConvert.SerializeObject(v).GetHashCode(),
            v => JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(v)));

        propertyBuilder.HasConversion(converter);
        propertyBuilder.Metadata.SetValueConverter(converter);
        propertyBuilder.Metadata.SetValueComparer(comparer);            

        return propertyBuilder;
    }        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...