RobotTaskConfiguration.cs 3.57 KB
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

namespace Rcs.Infrastructure.DB.Configuration.Domain
{
    /// <summary>
    /// RobotTask实体的EF Core配置
    /// @author zzy
    /// </summary>
    public class RobotTaskConfiguration : IEntityTypeConfiguration<RobotTask>
    {
        public void Configure(EntityTypeBuilder<RobotTask> builder)
        {
            builder.ToTable("robot_tasks");

            builder.HasKey(e => e.TaskId);

            builder.Property(e => e.TaskId)
                .HasColumnName("task_id")
                .ValueGeneratedNever();

            builder.Property(e => e.TaskCode)
                .HasColumnName("task_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.TaskName)
                .HasColumnName("task_name")
                .HasMaxLength(100);

            builder.Property(e => e.RobotId)
                .HasColumnName("robot_id");

            builder.Property(e => e.TaskTemplateId)
                .HasColumnName("task_template_id");

            builder.Property(e => e.BeginLocationId)
                .HasColumnName("begin_location_id");

            builder.Property(e => e.EndLocationId)
                .HasColumnName("end_location_id");

            builder.Property(e => e.Status)
                .HasColumnName("status")
                .IsRequired();
            builder.Property(e => e.Pause)
                .HasColumnName("pause")
                .HasDefaultValue(false);

            builder.Property(e => e.Priority)
                .HasColumnName("priority")
                .HasDefaultValue(99);

            builder.Property(e => e.ShelfCode)
                .HasColumnName("shelf_code")
                .HasMaxLength(50);
            
            builder.Property(e => e.Source)
                .HasColumnName("source")
                .HasMaxLength(300);
            
            builder.Property(e => e.Relation)
                .HasColumnName("relation")
                .HasMaxLength(300);

            builder.Property(e => e.ErrorInfo)
                .HasColumnName("error_info")
                .HasColumnType("text");

            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");

            // 索引
            builder.HasIndex(e => e.TaskCode)
                .HasDatabaseName("idx_task_code")
                .IsUnique();

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

            builder.HasIndex(e => e.RobotId)
                .HasDatabaseName("idx_task_robot_id");

            // 导航属性
            builder.HasOne(e => e.Robot)
                .WithMany()
                .HasForeignKey(e => e.RobotId)
                .OnDelete(DeleteBehavior.SetNull);

            builder.HasOne(e => e.BeginLocation)
                .WithMany()
                .HasForeignKey(e => e.BeginLocationId)
                .OnDelete(DeleteBehavior.SetNull);

            builder.HasOne(e => e.EndLocation)
                .WithMany()
                .HasForeignKey(e => e.EndLocationId)
                .OnDelete(DeleteBehavior.SetNull);

            builder.HasOne(e => e.TaskTemplate)
                .WithMany()
                .HasForeignKey(e => e.TaskTemplateId)
                .OnDelete(DeleteBehavior.SetNull);
        }
    }
}