RobotConfiguration.cs 6.74 KB
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

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

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

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

            builder.Property(e => e.CurrentMapCodeId)
                .HasColumnName("current_map_code");

            builder.Property(e => e.CurrentNodeId)
                .HasColumnName("current_node");

            builder.Property(e => e.CurrentX)
                .HasColumnName("current_x");

            builder.Property(e => e.CurrentY)
                .HasColumnName("current_y");

            builder.Property(e => e.CoordinateScale)
                .HasColumnName("coordinate_scale")
                .HasDefaultValue(1d);

            builder.Property(e => e.RobotCode)
                .HasColumnName("robot_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.RobotName)
                .HasColumnName("robot_name")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.RobotVersion)
                .HasColumnName("robot_version")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.ProtocolName)
                .HasColumnName("protocol_name")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.ProtocolVersion)
                .HasColumnName("protocol_version")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.RobotManufacturer)
                .HasColumnName("robot_manufacturer")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.RobotSerialNumber)
                .HasColumnName("robot_serial_number")
                .HasMaxLength(100)
                .IsRequired();

            builder.Property(e => e.RobotModel)
                .HasColumnName("robot_model")
                .HasMaxLength(100);

            builder.Property(e => e.RobotType)
                .HasColumnName("robot_type")
                .IsRequired();

            builder.Property(e => e.Status)
                .HasColumnName("status")
                .IsRequired();

            builder.Property(e => e.Online)
                .HasColumnName("online")
                .IsRequired();

            builder.Property(e => e.BatteryLevel)
                .HasColumnName("battery_level")
                .HasDefaultValue(100);

            builder.Property(e => e.Driving)
                .HasColumnName("driving")
                .HasDefaultValue(false);

            builder.Property(e => e.Paused)
                .HasColumnName("paused")
                .HasDefaultValue(false);

            builder.Property(e => e.Charging)
                .HasColumnName("charging")
                .HasDefaultValue(false);

            builder.Property(e => e.OperatingMode)
                .HasColumnName("operatingMode")
                .IsRequired();

            builder.Property(e => e.CurrentTheta)
                .HasColumnName("current_theta");

            builder.Property(e => e.Errors)
                .HasColumnName("errors")
                .HasColumnType("text");

            builder.Property(e => e.PayloadCapacity)
                .HasColumnName("payload_capacity");

            builder.Property(e => e.SpeedMax)
                .HasColumnName("speed_max");

            builder.Property(e => e.SpeedMin)
                .HasColumnName("speed_min");

            builder.Property(e => e.AccelerationMax)
                .HasColumnName("acceleration_max");

            builder.Property(e => e.DecelerationMax)
                .HasColumnName("deceleration_max");

            builder.Property(e => e.HeightMin)
                .HasColumnName("height_min");

            builder.Property(e => e.HeightMax)
                .HasColumnName("height_max");

            builder.Property(e => e.Width)
                .HasColumnName("width");

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

            builder.Property(e => e.IsOmnidirectional)
                .HasColumnName("is_omnidirectional")
                .HasDefaultValue(false);

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

            builder.Property(e => e.MotionCenterToEdge)
                .HasColumnName("motion_center_to_edge");

            builder.Property(e => e.IpAddress)
                .HasColumnName("ip_address");

            builder.Property(e => e.NetPort)
                .HasColumnName("net_port");

            builder.Property(e => e.MacAddress)
                .HasColumnName("mac_address");

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

            builder.Property(e => e.HeaderId)
                .HasColumnName("header_id")
                .HasDefaultValue(0L);

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

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

            // 忽略NotMapped属性
            builder.Ignore(e => e.NodeStates);
            builder.Ignore(e => e.EdgeStates);

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

            builder.HasIndex(e => e.Status)
                .HasDatabaseName("idx_robot_status");

            builder.HasIndex(e => e.Online)
                .HasDatabaseName("idx_robot_online");

            builder.HasIndex(e => e.RobotSerialNumber)
                .HasDatabaseName("idx_robot_serial")
                .IsUnique();

            // 配置导航属性 - 一对一关系
            builder.HasOne(e => e.MapNode)
                .WithOne(n => n.Robot)
                .HasForeignKey<MapNode>(n => n.RobotId)
                .OnDelete(DeleteBehavior.NoAction);
                
            builder.HasOne(e => e.Map)
                .WithMany()
                .HasForeignKey(e => e.CurrentMapCodeId)
                .OnDelete(DeleteBehavior.NoAction);
        }
    }
}