MapEdgeConfiguration.cs 4.84 KB
using System.Text.Json;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

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

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

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

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

            builder.Property(e => e.EdgeCode)
                .HasColumnName("edge_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.FromNode)
                .HasColumnName("from_node")
                .IsRequired();

            builder.Property(e => e.ToNode)
                .HasColumnName("to_node")
                .IsRequired();

            builder.Property(e => e.EdgeName)
                .HasColumnName("edge_name");

            builder.Property(e => e.Length)
                .HasColumnName("length")
                .IsRequired();

            builder.Property(e => e.Cost)
                .HasColumnName("cost")
                .HasDefaultValue(1d);

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

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

            builder.Property(e => e.IsCurve)
                .HasColumnName("is_curve")
                .HasDefaultValue(false);

            builder.Property(e => e.Radius)
                .HasColumnName("radius");

            builder.Property(e => e.CenterX)
                .HasColumnName("center_x");

            builder.Property(e => e.CenterY)
                .HasColumnName("center_y");

            builder.Property(e => e.Degree)
                .HasColumnName("degree")
                .HasDefaultValue(2);

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

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

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

            builder.Property(e => e.Regress)
                .HasColumnName("regress")
                .HasDefaultValue(false);

            builder.Property(e => e.MaxCoordinateOffset)
                .HasColumnName("max_coordinate_offset");

            builder.Property(e => e.MaxAngleDeviation)
                .HasColumnName("max_angle_deviation");

            builder.Property(e => e.MaxSpeed)
                .HasColumnName("max_speed");

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

            builder.HasIndex(e => new { e.MapId, e.EdgeCode })
                .HasDatabaseName("idx_edge_map_code");

            builder.HasIndex(e => e.FromNode)
                .HasDatabaseName("idx_edge_from_node");

            builder.HasIndex(e => e.ToNode)
                .HasDatabaseName("idx_edge_to_node");

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

            builder.HasOne(e => e.MapNodesFromNode)
                .WithMany(n => n.MapEdgesFromNodes)
                .HasForeignKey(e => e.FromNode)
                .OnDelete(DeleteBehavior.NoAction);

            builder.HasOne(e => e.MapNodesToNode)
                .WithMany(n => n.MapEdgesToNodes)
                .HasForeignKey(e => e.ToNode)
                .OnDelete(DeleteBehavior.NoAction);
        }
    }
}