Как сделать таблицу 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
таблица в базе данных.