gpt4 book ai didi

c# - EF Core 中具有自动序列化/反序列化的自定义类型

转载 作者:行者123 更新时间:2023-11-30 21:36:10 24 4
gpt4 key购买 nike

我正在使用 ical.net 库来处理我的 ASP.NET Core 2 应用程序中的重复规则和重复事件。我希望能够序列化一个 CalendarEvent 对象并将其保存在数据库中,我正在寻找这样做的最佳实践方法。我考虑过使用非映射属性来保存实际对象,并定义字符串映射属性,并使用 DbContext 中的事件处理程序来序列化对象并将其设置为字符串属性,然后再保存实体,同样在构建实体时从序列化字符串重新创建 CalendarEvent 对象。类似于以下内容:

public class AvailabilityRule: ApplicationEntity
{
...

[NotMapped]
public CalendarEvent Event { get; set; }

}

public class ApplicationDbContext : AuditableDbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<AvailabilityRule>().Property<string>("SerializedEvent");
}

public override int SaveChanges()
{
// Get instances of AvailabilityRule from ChangeTracker, and
// set the serialized property
}
}

我假设有一个类似的方法我可以重写以在从数据库中提取记录时执行相反的操作,但我不知道它是什么。

作为 ASP.NET 和 Entity Framework 的新手,我很关心以正确的方式做事TM,所以我很想知道是否有更好的方法。我在网上找不到很多关于这个主题的信息。

最佳答案

事实证明,使用 Value Conversions 将复杂实体作为 JSON 存储在单个数据库列中非常容易。这是在 EF Core 2.1 中添加的。

[NotMapped] 不需要

public class AvailabilityRule: ApplicationEntity
{
...
// [NotMapped]
public CalendarEvent Event { get; set; }
}

为 PropertyBuilder 添加以下扩展:

public static class PropertyBuilderExtensions
{
public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder) where T : class, new()
{
ValueConverter<T, string> converter = new ValueConverter<T, string>
(
v => JsonSerializer.Serialize(v, null),
v => JsonSerializer.Deserialize<T>(v, null) ?? new T()
);

ValueComparer<T> comparer = new ValueComparer<T>
(
(l, r) => JsonSerializer.Serialize(l, null) == JsonSerializer.Serialize(r, null),
v => v == null ? 0 : JsonSerializer.Serialize(v, null).GetHashCode(),
v => JsonSerializer.Deserialize<T>(JsonSerializer.Serialize(v, null), null)
);

propertyBuilder.HasConversion(converter);
propertyBuilder.Metadata.SetValueConverter(converter);
propertyBuilder.Metadata.SetValueComparer(comparer);
propertyBuilder.HasColumnType("jsonb");

return propertyBuilder;
}
}

在数据库上下文的 OnModelCreating 方法中需要调用 HasJsonConversion,它会对您的对象执行序列化、反序列化和跟踪更改:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<AvailabilityRule>()
.Property(b => b.Event )
.HasJsonConversion();
}

关于c# - EF Core 中具有自动序列化/反序列化的自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com