StorageLocationConfiguration.cs 3.07 KB
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rcs.Domain.Entities;

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

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

            builder.Property(e => e.LocationId)
                .HasColumnName("location_id")
                .ValueGeneratedNever();

            builder.Property(e => e.AreaId)
                .HasColumnName("area_id")
                .IsRequired();

            builder.Property(e => e.LocationTypeId)
                .HasColumnName("location_type_id");

            builder.Property(e => e.LocationCode)
                .HasColumnName("location_code")
                .HasMaxLength(50)
                .IsRequired();

            builder.Property(e => e.LocationName)
                .HasColumnName("location_name")
                .HasMaxLength(100);

            builder.Property(e => e.LayerNumber)
                .HasColumnName("layer_number");

            builder.Property(e => e.Status)
                .HasColumnName("status")
                .HasDefaultValue(StorageLocationStatus.Empty);

            builder.Property(e => e.IsActive)
                .HasColumnName("is_active")
                .HasDefaultValue(true);

            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.HasOne(e => e.StorageArea)
                .WithMany(a => a.StorageLocations)
                .HasForeignKey(e => e.AreaId)
                .OnDelete(DeleteBehavior.Cascade);

            builder.HasOne(e => e.MapNode)
                .WithMany(n => n.StorageLocations)
                .HasForeignKey(e => e.MapNodeId)
                .OnDelete(DeleteBehavior.NoAction);

            builder.HasOne(e => e.LocationType)
                .WithMany(t => t.StorageLocations)
                .HasForeignKey(e => e.LocationTypeId)
                .OnDelete(DeleteBehavior.NoAction);

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

            builder.HasIndex(e => e.AreaId)
                .HasDatabaseName("idx_storage_location_area_id");

            builder.HasIndex(e => e.MapNodeId)
                .HasDatabaseName("idx_storage_location_map_node_id");


            builder.HasIndex(e => e.LocationTypeId)
                .HasDatabaseName("idx_storage_location_type_id");

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