EF Core 5 сбрасывает последовательность HiLo

#asp.net #asp.net-core #entity-framework-migrations #.net-5 #ef-core-5.0

#asp.net #asp.net-ядро #entity-framework-миграции #.net-5 #ef-core-5.0

Вопрос:

Недавно я перенес один из своих проектов asp net core в .net5. В моем проекте я использовал EF, после миграции я обновился до EF core 5. Я использую 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;
    }
 

Не уверен, что этого достаточно, чтобы вы, люди, имели представление о том, о чем я говорю.
Как вы можете видеть, EF добавил два столбца, но в то же время сгенерировал код для удаления всех последовательностей HiLo. Остальные мои конфигурации очень похожи на ту, которую я опубликовал здесь.

Заранее большое спасибо.

Комментарии:

1. Опубликуйте свой код и миграцию. Как выглядел код SQL? UseHiLo никуда не делся.

2. @PanagiotisKanavos опубликовал код, спасибо за ваш комментарий