MapConfiguration.cs 3.34 KB
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

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

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

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

            builder.Property(e => e.MapCode)
                .HasColumnName("map_code")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.MapName)
                .HasColumnName("map_name")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.MapType)
                .HasColumnName("map_type")
                .IsRequired();

            builder.Property(e => e.Version)
                .HasColumnName("version")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.Description)
                .HasColumnName("description");

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

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

            builder.Property(e => e.ResourceUrl)
                .HasColumnName("resource_url")
                .HasMaxLength(512);

            builder.Property(e => e.PointsUrl)
                .HasColumnName("points_url")
                .HasMaxLength(512);

            builder.Property(e => e.ResourceAutoSync)
                .HasColumnName("resource_auto_sync")
                .HasDefaultValue(false);

            builder.Property(e => e.ResourceSyncInterval)
                .HasColumnName("resource_sync_interval")
                .HasDefaultValue(60);

            builder.Property(e => e.PointsAutoSync)
                .HasColumnName("points_auto_sync")
                .HasDefaultValue(false);

            builder.Property(e => e.PointsSyncInterval)
                .HasColumnName("points_sync_interval")
                .HasDefaultValue(60);

            // 配置索引
            builder.HasIndex(e => e.MapCode)
                .HasDatabaseName("idx_map_code")
                .IsUnique();

            builder.HasIndex(e => e.Active)
                .HasDatabaseName("idx_map_active");

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

            builder.HasMany(e => e.MapNodes)
                .WithOne(e => e.Map)
                .HasForeignKey(e => e.MapId)
                .OnDelete(DeleteBehavior.Cascade);

            builder.HasMany(e => e.MapResources)
                .WithOne(e => e.Maps)
                .HasForeignKey(e => e.MapId)
                .OnDelete(DeleteBehavior.Cascade);
        }
    }
}