最近,我已经将一个asp网络核心项目迁移到.net5。在我的项目中,我使用了EF,在迁移之后,我升级到了EF核心5。我使用HiLo作为我的PKs,就在昨天我添加了一个新的专栏,当生成迁移时,我注意到EF删除了与HiLo PK相关的所有序列。
这是EF核心5上的一个新行为吗?这是个虫子吗?我应该做点什么来防止这种情况发生吗?
编辑
这是生成的迁移之一,drops被注释了:
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序列的代码。我的其他配置看起来与我在这里发布的配置非常相似。
提前谢谢。
发布于 2022-08-12 16:35:52
面对同样的错误,但在EFCorev6.0.8中,问题是由于modelBuilder.HasDefaultSchema(“定制db模式”);在db上下文OnModelCreating方法中。如果没有定制模式的显式配置,一切都可以正常工作。
这是一个bug,已经在GitHub上报道过了。https://github.com/dotnet/efcore/issues/28223
https://stackoverflow.com/questions/65735992
复制相似问题