#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 опубликовал код, спасибо за ваш комментарий