代码之家  ›  专栏  ›  技术社区  ›  jcgalveza

EF核心5丢弃HiLo序列

  •  0
  • jcgalveza  · 技术社区  · 5 年前

    我最近将一个asp net核心项目迁移到.net5。在我的项目中我使用了EF,在迁移之后我升级到了efcore5。我使用HiLo作为我的PKs,就在昨天,我添加了一个新的列,当生成迁移时,我注意到EF删除了我所有与HiLo-PK相关的序列。

    这是EF Core 5的新行为吗?这是虫子吗?我应该做些什么来防止这种情况发生吗?

    编辑

    这是生成的迁移之一,删除操作如下:

    protected override void Up(MigrationBuilder migrationBuilder)
        {
            //migrationBuilder.DropSequence(
            //    name: "centers_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "dock_call_message_templates_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "dock_call_notifications_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "dock_calls_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "dock_state_logs_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "dock_waiting_queue_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "docks_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "factory_call_message_templates_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "factory_call_notifications_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "factory_calls_hilo",
            //    schema: "dbo");
    
            //migrationBuilder.DropSequence(
            //    name: "trucks_hilo",
            //    schema: "dbo");
    
            migrationBuilder.AddColumn<bool>(
                name: "registry_complete",
                schema: "dbo",
                table: "trucks",
                type: "bit",
                nullable: false,
                defaultValue: false);
    
            migrationBuilder.AddColumn<DateTimeOffset>(
                name: "registry_completion_date",
                schema: "dbo",
                table: "trucks",
                type: "datetimeoffset",
                nullable: true);
        }
    
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "registry_complete",
                schema: "dbo",
                table: "trucks");
    
            migrationBuilder.DropColumn(
                name: "registry_completion_date",
                schema: "dbo",
                table: "trucks");
    
            //migrationBuilder.CreateSequence(
            //    name: "centers_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "dock_call_message_templates_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "dock_call_notifications_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "dock_calls_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "dock_state_logs_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "dock_waiting_queue_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "docks_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "factory_call_message_templates_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "factory_call_notifications_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "factory_calls_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
    
            //migrationBuilder.CreateSequence(
            //    name: "trucks_hilo",
            //    schema: "dbo",
            //    incrementBy: 10);
        }
    

    public class TruckConfiguration : IEntityTypeConfiguration<Truck>
    {
        public void Configure(EntityTypeBuilder<Truck> builder)
        {
    
            builder.ConfigBaseEntity<Truck, int>("trucks");
    
            builder.Property(t => t.LicensePlate)
                   .HasColumnName("license_plate")
                   .HasMaxLength(MAX_LICENSEPLATE_LENGTH)
                   .IsRequired();
    
            builder.Property(t => t.LogisticOperator)
                   .HasColumnName("logistic_operator")
                   .HasMaxLength(MAX_LOGISTIC_OPERATOR_LENGTH)
                   .IsRequired(false);
    
            builder.Property(t => t.RegistryComplete)
                   .HasColumnName("registry_complete")
                   .IsRequired(true)
                   .HasDefaultValue(false);
    
            builder.Property(t => t.RegistryCompletionDate)
                   .HasColumnName("registry_completion_date")
                   .IsRequired(false);
    
            builder.HasOne(t=>(DockWaitingQueueItem)t.DockWaitingQueue)
                   .WithOne(i => (Truck)i.Truck)
                   .IsRequired(true)
                   .HasForeignKey<DockWaitingQueueItem>(i => i.TruckId)
                   .HasConstraintName("FK_dock_waiting_queue_truck")
                   .HasPrincipalKey<Truck>(t => t.Id)
                   .OnDelete(DeleteBehavior.Cascade);
                   
            builder.OwnsOne(t => (Driver)t.Driver,
                            d =>
                            {
                                d.ToTable("truck_drivers");
                                d.Property(d => d.Name)
                                 .HasColumnName("driver_name")
                                 .IsRequired()
                                 .HasMaxLength(MAX_DRIVER_NAME_LENGTH);
    
                                d.Property(d => d.Surnames)
                                 .HasColumnName("driver_surnames")
                                 .IsRequired()
                                 .HasMaxLength(MAX_DRIVER_SURNAMES_LENGTH);
    
                                d.Property(d => d.Language)
                                 .HasColumnName("driver_language")
                                 .IsRequired()
                                 .HasMaxLength(MAX_DRIVER_LANGUAGE_LENGTH);
    
                                d.Property(d => d.PhoneNumber)
                                 .HasColumnName("driver_phone_number")
                                 .IsRequired()
                                 .HasMaxLength(MAX_DRIVER_PHONE_NUMBER_LENGTH);
                            });
    
            builder.HasMany(t => (IEnumerable<FactoryCall>)t.FactoryCalls)
                   .WithOne(fc => (Truck)fc.Truck)
                   .IsRequired()
                   .HasForeignKey(fc => fc.TruckId)
                   .HasConstraintName("FK_factory_calls_trucks")
                   .HasPrincipalKey(t => t.Id)
                   .OnDelete(DeleteBehavior.Cascade);
    
            builder.HasMany(t => (IEnumerable<DockCall>)t.DockCalls)
                   .WithOne(dc => (Truck)dc.Truck)
                   .IsRequired()
                   .HasConstraintName("FK_dock_calls_trucks")
                   .HasPrincipalKey(t => t.Id)
                   .OnDelete(DeleteBehavior.Cascade);
    
            builder.HasIndex(t => t.LicensePlate)
                   .HasDatabaseName("IX_trucks_license_plate")
                   .IsClustered(false);
                   
            
        }
    }
    

    最后,这是“ConfigBaseEntity”的代码

    public static EntityTypeBuilder<TEntity> ConfigBaseEntity<TEntity, TKey>(this EntityTypeBuilder<TEntity> builder, string tableName) where TEntity: BaseObject<TKey>
        {
            builder.ToTable(tableName)
                   .HasKey(ent => ent.Id)
                   .IsClustered()
                   .HasName($"PK_{tableName}");
    
            builder.Property(ent => ent.Id)
                   .UseHiLo($"{tableName}_hilo", MAIN_DB_SCHEMA)
                   .HasColumnName("id")
                   .IsRequired();
    
            builder.Property(t => t.CreationDate)
                   .HasColumnName("creation_date")
                   .IsRequired();
    
            builder.Property(t => t.ArchivedDate)
                   .HasColumnName("archived_date")
                   .IsRequired(false);
    
            builder.Ignore(t => t.IsArchived);
    
            return builder;
        }
    

    我不知道这是否足够让你们知道我在说什么。

    提前多谢了。

    0 回复  |  直到 5 年前
    推荐文章