首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心5下降HiLo序列

EF核心5下降HiLo序列
EN

Stack Overflow用户
提问于 2021-01-15 12:18:17
回答 1查看 406关注 0票数 0

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

这是EF核心5上的一个新行为吗?这是个虫子吗?我应该做点什么来防止这种情况发生吗?

编辑

这是生成的迁移之一,drops被注释了:

代码语言:javascript
复制
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);
    }

这是我的实体配置:

代码语言:javascript
复制
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“的代码

代码语言:javascript
复制
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序列的代码。我的其他配置看起来与我在这里发布的配置非常相似。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-08-12 16:35:52

面对同样的错误,但在EFCorev6.0.8中,问题是由于modelBuilder.HasDefaultSchema(“定制db模式”);在db上下文OnModelCreating方法中。如果没有定制模式的显式配置,一切都可以正常工作。

这是一个bug,已经在GitHub上报道过了。https://github.com/dotnet/efcore/issues/28223

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65735992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档