JSON 序列化值转换未跟踪 EF Core 的更改
JSON serialization Value Conversion not tracking changes with EF Core
我正在使用 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
.
的更改
我假设有一些方法可以在对象级别强制执行此操作。我已尝试在 MySerializableObject
上实施 IEqualityComparer
,但更改跟踪没有开始工作。
我可以通过向 属性 的元数据添加 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;
}
}
我正在使用 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
.
我假设有一些方法可以在对象级别强制执行此操作。我已尝试在 MySerializableObject
上实施 IEqualityComparer
,但更改跟踪没有开始工作。
我可以通过向 属性 的元数据添加 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;
}
}