.net ef core list<string> 属性映射

这篇博客详细介绍了如何在 Entity Framework Core 中配置属性 `RelatedSo` 使用 JSON 序列化和反序列化,确保在数据库存储和应用程序之间正确转换 List<string> 类型的数据。通过设置 ValueConverter 并定义序列化比较器,实现了序列化的细节控制,确保数据的一致性和完整性。
   entity.Property(e => e.RelatedSo)
                      .HasConversion(v => JsonSerializer.Serialize(v, default),
                                   v => JsonSerializer.Deserialize<List<string>>(v, default))
                        .Metadata
                      .SetValueComparer(new ValueComparer<List<string>>(
                        (c1, c2) => c1.SequenceEqual(c2),
                        c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
                        c => c.ToList()));

    public List<string> RelatedSo { get; set; }

using System.Text.Json; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using NySchedulingSystem.Domain.Aggregates; using NySchedulingSystem.Domain.Entities; namespace NySchedulingSystem.Infrastructure.Persistence.Configurations { public class ProductionPlanEntityTypeConfiguration : IEntityTypeConfiguration<ProductionPlan> { public void Configure(EntityTypeBuilder<ProductionPlan> builder) { // 数据库表名 builder.ToTable("production_plans"); // 主键配置 builder.HasKey(x => x.id); builder.Property(x => x.id).HasColumnName("id"); // 值对象列映射 builder.Property<int>("production_code").HasColumnName("production_code"); builder.Property<string>("work_order_code").HasColumnName("work_order_code"); builder.Property<string>("drawing_code").HasColumnName("drawing_code"); builder.Property<string>("dispatcher").HasColumnName("dispatcher"); builder.Property<int>("plan_count").HasColumnName("plan_count"); builder.Property<DateTime>("plan_begin_time").HasColumnName("plan_begin_time"); builder.Property<DateTime>("plan_end_time").HasColumnName("plan_end_time"); // 集合关系配置 builder.OwnsMany<Procs>("procses", procs_builder => { // 数据库表名 procs_builder.ToTable("procs"); // 主键配置 procs_builder.HasKey(x => x.id); procs_builder.Property(x => x.id).HasColumnName("id"); // 值对象列映射 procs_builder.Property<string>("procs_code").HasColumnName("procs_code"); procs_builder.Property<string>("device_code").HasColumnName("device_code"); procs_builder.Property<string>("device_type").HasColumnName("device_type"); procs_builder.Property<string>("priority").HasColumnName("priority"); procs_builder.Property<string>("team_leader").HasColumnName("team_leader"); procs_builder.Property<string>("worker").HasColumnName("worker"); procs_builder.Property<DateTime>("plan_begin_time").HasColumnName("plan_begin_time"); procs_builder.Property<DateTime>("plan_end_time").HasColumnName("plan_end_time"); procs_builder.OwnsMany<DerivedProcs>("derived_procses", derived_procs_builder => { // 数据库表名 derived_procs_builder.ToTable("derived_procs"); // 主键配置 derived_procs_builder.HasKey(x => x.id); derived_procs_builder.Property(x => x.id).HasColumnName("id"); // 值对象列映射 derived_procs_builder.Property<string>("priority").HasColumnName("priority"); derived_procs_builder.Property<string>("device_type").HasColumnName("device_type"); derived_procs_builder.Property<string>("device_code").HasColumnName("device_code"); derived_procs_builder.Property<string>("plan_count").HasColumnName("plan_count"); derived_procs_builder.Property<string>("pallet_count").HasColumnName("pallet_count"); derived_procs_builder.Property<DateTime>("plan_begin_time").HasColumnName("plan_begin_time"); derived_procs_builder.Property<DateTime>("plan_end_time").HasColumnName("plan_end_time"); derived_procs_builder.Property<DateTime?>("actual_start_time").HasColumnName("actual_start_time"); derived_procs_builder.Property<DateTime?>("actual_end_time").HasColumnName("actual_end_time"); derived_procs_builder.Property<int>("state").HasColumnName("state"); derived_procs_builder.Property<string>("team_leader").HasColumnName("team_leader"); derived_procs_builder.Property<string>("worker").HasColumnName("worker"); derived_procs_builder.OwnsMany<DerivedProcsTask>("tasks", derived_procs_task_builder => { // 数据库表名 procs_builder.ToTable("derived_procs_task"); // 主键配置 derived_procs_task_builder.HasKey(x => x.id); derived_procs_task_builder.Property(x => x.id).HasColumnName("id"); // 值对象列映射 derived_procs_task_builder.Property<DateTime>("create_time").HasColumnName("create_time"); derived_procs_task_builder.Property<DateTime?>("start_time").HasColumnName("start_time"); derived_procs_task_builder.Property<DateTime?>("end_time") .HasColumnName("end_time"); derived_procs_task_builder.Property<List<string>>("pallet_codes") .HasColumnName("pallet_codes") .HasConversion( x => JsonSerializer.Serialize(x, JsonOptions), x => JsonSerializer.Deserialize<List<string>>(x, JsonOptions) ?? new()); }); }); }); } static readonly JsonSerializerOptions JsonOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = false }; } } 怎么自动生成数据库
09-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值