Как сделать таблицу AspNetUsers временной?

Начиная с Entity Framework Core 6.0 доступны темпоральные таблицы .В этом примере в сообщении блога говорится, что это так же просто, как добавитьIsTemporal():

      protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Customer>()
        .ToTable("Customers", b => b.IsTemporal());

    modelBuilder
        .Entity<Product>()
        .ToTable("Products", b => b.IsTemporal());

    modelBuilder
        .Entity<Order>()
        .ToTable("Orders", b => b.IsTemporal());
}

Я создал новое приложение ASP.NET Core 7 Razor Pages с помощью шаблона Visual Studio 2022 с индивидуальными учетными записями для аутентификации (в док-контейнере Linux, но я не думаю, что это имеет значение).

вData\Migrations\папка, миграция называется00000000000000_CreateIdentitySchema.csавтоматически создается для вас. Я попытался сделатьAspNetUsersвременная таблица, изменив эту строку в00000000000000_CreateIdentitySchema.Designer.cs:

      modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
    // All the column and constraint definitions

     b.ToTable("AspNetUsers", c => c.IsTemporal());
});

Когда я добавил аргумент, как показано в инструкции, и пытаюсь запустить, я получаю очень расплывчатое сообщение об ошибке:

Значение не может быть нулевым. (Параметр «имя»)

Трассировка стека мне не помогла, но вот для полноты картины:

      Applying migration '00000000000000_CreateIdentitySchema'.
System.ArgumentNullException: Value cannot be null. (Parameter 'name')
   at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.EntityType.FindProperty(String name)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.EntityType.Microsoft.EntityFrameworkCore.Metadata.IEntityType.FindProperty(String name)
   at Microsoft.EntityFrameworkCore.SqlServer.Metadata.Internal.SqlServerAnnotationProvider.For(IColumn column, Boolean designTime)+MoveNext()
   at Microsoft.EntityFrameworkCore.Infrastructure.AnnotatableBase.AddAnnotations(AnnotatableBase annotatable, IEnumerable`1 annotations)
   at Microsoft.EntityFrameworkCore.Infrastructure.AnnotatableBase.AddAnnotations(IEnumerable`1 annotations)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.RelationalModel.Create(IModel model, IRelationalAnnotationProvider relationalAnnotationProvider, IRelationalTypeMappingSource relationalTypeMappingSource, Boolean designTime)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.RelationalModel.Add(IModel model, IRelationalAnnotationProvider relationalAnnotationProvider, IRelationalTypeMappingSource relationalTypeMappingSource, Boolean designTime)
   at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelRuntimeInitializer.InitializeModel(IModel model, Boolean designTime, Boolean prevalidation)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelRuntimeInitializer.Initialize(IModel model, Boolean designTime, IDiagnosticsLogger`1 validationLogger)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.FinalizeModel(IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateUpSql(Migration migration, MigrationsSqlGenerationOptions options)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.<>c__DisplayClass16_2.<GetMigrationCommandLists>b__2()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

если я удалюc => c.IsTemporal(),dotnet ef database updateудается, но таблица - это просто обычная таблица.

1 ответ

Вызов метода кажется законным , поэтому я не уверен, что здесь не так.

Однако вы также можете переопределитьOnModelCreating, что, если возможно, всегда предпочтительнее изменения кода миграции. Для типов, принадлежащих ASP.Net Identity, необходимо выполнить дополнительную настройку после базового вызова (хотя в данном случае это безразлично):

      protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<IdentityUser<Guid>>().ToTable("AspNetUsers", t => t.IsTemporal());
}

ГдеMyUserпроисходит отIdentityUserс, в этом примере, настроенным, чтобы иметьGuidкак тип первичного ключа. Конечно, он также работает со значением по умолчанию (первичный ключstring).

Это создает системную версиюAspNetUsersтаблица в базе данных.

Другие вопросы по тегам