MapResourceConfiguration.cs 4.53 KB
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

namespace Rcs.Infrastructure.DB.Configuration.Domain
{
    /// <summary>
    /// MapResource实体的EF Core配置
    /// </summary>
    public class MapResourceConfiguration : IEntityTypeConfiguration<MapResource>
    {
        public void Configure(EntityTypeBuilder<MapResource> builder)
        {
            // 配置表名
            builder.ToTable("map_resources");

            // 配置主键
            builder.HasKey(e => e.ResourceId);

            // 配置属性
            builder.Property(e => e.ResourceId)
                .HasColumnName("resource_id")
                .ValueGeneratedNever();

            builder.Property(e => e.MapId)
                .HasColumnName("map_id")
                .IsRequired();

            builder.Property(e => e.ResourceCode)
                .HasColumnName("resource_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.ResourceName)
                .HasColumnName("resource_name")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.Type)
                .HasColumnName("type")
                .IsRequired();

            builder.Property(e => e.Capacity)
                .HasColumnName("capacity")
                .HasDefaultValue(1);

            builder.Property(e => e.LocationCoordinates)
                .HasColumnName("location_coordinates")
                .HasColumnType("geometry(Polygon)");

            builder.Property(e => e.CreatedAt)
                .HasColumnName("created_at")
                .HasColumnType("timestamp without time zone");

            builder.Property(e => e.Active)
                .HasColumnName("active")
                .HasDefaultValue(true);

            // @author zzy - 新增字段配置
            builder.Property(e => e.MaxSpeed)
                .HasColumnName("max_speed")
                .HasDefaultValue(2.0);

            builder.Property(e => e.CanRotate)
                .HasColumnName("can_rotate")
                .HasDefaultValue(true);

            // @author zzy - 前后置动作配置
            builder.Property(e => e.PreAction1Type)
                .HasColumnName("pre_action1_type");

            builder.Property(e => e.PreNetActions1)
                .HasColumnName("pre_net_actions1")
                .HasColumnType("jsonb").HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<Guid>?>(v, (JsonSerializerOptions?)null)!);

            builder.Property(e => e.PostAction1Type)
                .HasColumnName("post_action1_type");

            builder.Property(e => e.PostNetActions1)
                .HasColumnName("post_net_actions1")
                .HasColumnType("jsonb").HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<Guid>?>(v, (JsonSerializerOptions?)null)!);

            builder.Property(e => e.PreAction2Type)
                .HasColumnName("pre_action2_type");

            builder.Property(e => e.PreNetActions2)
                .HasColumnName("pre_net_actions2")
                .HasColumnType("jsonb").HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<Guid>?>(v, (JsonSerializerOptions?)null)!);

            builder.Property(e => e.PostAction2Type)
                .HasColumnName("post_action2_type");

            builder.Property(e => e.PostNetActions2)
                .HasColumnName("post_net_actions2")
                .HasColumnType("jsonb").HasConversion(
                    v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null),
                    v => JsonSerializer.Deserialize<List<Guid>?>(v, (JsonSerializerOptions?)null)!);

            // 配置索引
            builder.HasIndex(e => e.MapId)
                .HasDatabaseName("idx_resource_map");

            builder.HasIndex(e => e.ResourceCode)
                .HasDatabaseName("idx_resource_code");

            builder.HasIndex(e => e.Type)
                .HasDatabaseName("idx_resource_type");

            // 配置导航属性 - 多对一关系
            builder.HasOne(e => e.Maps)
                .WithMany(m => m.MapResources)
                .HasForeignKey(e => e.MapId)
                .OnDelete(DeleteBehavior.Cascade);
        }
    }
}