Skip to content

bug: Ошибка при сохранении сущности без указания дефолтных полей #552

@artur-arutiunian

Description

@artur-arutiunian

Bug Report

YDB dotnet SDK version:
Ydb.Sdk 0.24.0

EntityFrameworkCore.Ydb version:
0.1.0

Environment
macOS
dotnet 9.0.101
arm

Current behavior:
При попытке выполнить сидинг данных через EF Core миграции возникает ошибка, связанная с обязательным not null полем EmailConfirmed. Хотя в миграции для этого поля указано значение по умолчанию (defaultValue: false), во время выполнения INSERT возникает ошибка:
Error: Missing not null column in input: EmailConfirmed. All not null columns should be initialized.

Expected behavior:
Миграции и сидинг данных успешно выполняются, если столбец имеет значение по умолчанию и не передаётся явно.

Steps to reproduce:

  1. Настройте проект на .NET 9 с Microsoft.EntityFrameworkCore 9.0.5, EntityFrameworkCore.Ydb 0.1.0 и Ydb.Sdk 0.24.0
  2. Создайте сущность пользователя и миграцию (пример структуры таблицы ниже)
  3. Выполните миграцию и попробуйте вставить пользователя без явного указания поля EmailConfirmed
  4. Получите ошибку о пропущенном not null столбце

Related code:

Конфигурация таблицы из миграции

migrationBuilder.CreateTable(
    name: "AbpUsers",
    columns: table => new
    {
        Id = table.Column<Guid>(type: "Uuid", nullable: false),
        TenantId = table.Column<Guid>(type: "Uuid", nullable: true),
        UserName = table.Column<string>(type: "Text", maxLength: 256, nullable: false),
        NormalizedUserName = table.Column<string>(type: "Text", maxLength: 256, nullable: false),
        Name = table.Column<string>(type: "Text", maxLength: 64, nullable: true),
        Surname = table.Column<string>(type: "Text", maxLength: 64, nullable: true),
        Email = table.Column<string>(type: "Text", maxLength: 256, nullable: false),
        NormalizedEmail = table.Column<string>(type: "Text", maxLength: 256, nullable: false),
        EmailConfirmed = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        PasswordHash = table.Column<string>(type: "Text", maxLength: 256, nullable: true),
        SecurityStamp = table.Column<string>(type: "Text", maxLength: 256, nullable: false),
        IsExternal = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        PhoneNumber = table.Column<string>(type: "Text", maxLength: 16, nullable: true),
        PhoneNumberConfirmed = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        IsActive = table.Column<bool>(type: "Bool", nullable: false),
        TwoFactorEnabled = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        LockoutEnd = table.Column<string>(type: "Text", nullable: true),
        LockoutEnabled = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        AccessFailedCount = table.Column<int>(type: "Int32", nullable: false, defaultValue: 0)
            .Annotation("YdbSerial", true),
        ShouldChangePasswordOnNextLogin = table.Column<bool>(type: "Bool", nullable: false),
        EntityVersion = table.Column<int>(type: "Int32", nullable: false),
        LastPasswordChangeTime = table.Column<string>(type: "Text", nullable: true),
        ExtraProperties = table.Column<string>(type: "Text", nullable: false),
        ConcurrencyStamp = table.Column<string>(type: "Text", maxLength: 40, nullable: false),
        CreationTime = table.Column<DateTime>(type: "Timestamp", nullable: false),
        CreatorId = table.Column<Guid>(type: "Uuid", nullable: true),
        LastModificationTime = table.Column<DateTime>(type: "Timestamp", nullable: true),
        LastModifierId = table.Column<Guid>(type: "Uuid", nullable: true),
        IsDeleted = table.Column<bool>(type: "Bool", nullable: false, defaultValue: false),
        DeleterId = table.Column<Guid>(type: "Uuid", nullable: true),
        DeletionTime = table.Column<DateTime>(type: "Timestamp", nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_AbpUsers", x => x.Id);
    });

Полный лог ошибки

[17:36:22 ERR] Failed executing DbCommand (40ms) [Parameters=[$p0='?' (DbType = Guid), $p1='?', $p2='?' (DbType = DateTime), $p3='?' (DbType = Guid), $p4='?' (DbType = Guid), $p5='?' (DbType = DateTime), $p6='?', $p7='?' (DbType = Int32), $p8='?', $p9='?' (DbType = Boolean), $p10='?' (DbType = DateTime), $p11='?' (DbType = Guid), $p12='?', $p13='?' (DbType = Boolean), $p14='?', $p15='?', $p16='?', $p17='?', $p18='?', $p19='?', $p20='?', $p21='?' (DbType = Boolean), $p22='?', $p23='?' (DbType = Guid), $p24='?'], CommandType='Text', CommandTimeout='0']
INSERT INTO `AbpUsers` (`Id`, `ConcurrencyStamp`, `CreationTime`, `CreatorId`, `DeleterId`, `DeletionTime`, `Email`, `EntityVersion`, `ExtraProperties`, `IsActive`, `LastModificationTime`, `LastModifierId`, `LastPasswordChangeTime`, `LockoutEnabled`, `LockoutEnd`, `Name`, `NormalizedEmail`, `NormalizedUserName`, `PasswordHash`, `PhoneNumber`, `SecurityStamp`, `ShouldChangePasswordOnNextLogin`, `Surname`, `TenantId`, `UserName`)
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17, @p18, @p19, @p20, @p21, @p22, @p23, @p24)
RETURNING `AccessFailedCount`,`EmailConfirmed`,`IsDeleted`,`IsExternal`,`PhoneNumberConfirmed`,`TwoFactorEnabled`;
[17:36:22 ERR] An exception occurred in the database while saving changes for context type 'DJurist.Sro.Monitoring.EntityFrameworkCore.MonitoringDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
 ---> Ydb.Sdk.Ado.YdbException (0x80004005): Status: BadRequest, Issues:
[1030] Error: Type annotation
    [0] (26:13) Error: At function: KiWriteTable!
        [2032] (26:13) Error: Missing not null column in input: EmailConfirmed. All not null columns should be initialized
   at Ydb.Sdk.Ado.YdbDataReader.NextExecPart(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.Init(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.CreateYdbDataReader(IServerStream`1 resultSetStream, Action`1 onNotSuccessStatusCode, YdbTransaction ydbTransaction, CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChangesAsync(IList`1 entries, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
 ---> Ydb.Sdk.Ado.YdbException (0x80004005): Status: BadRequest, Issues:
[1030] Error: Type annotation
    [0] (26:13) Error: At function: KiWriteTable!
        [2032] (26:13) Error: Missing not null column in input: EmailConfirmed. All not null columns should be initialized
   at Ydb.Sdk.Ado.YdbDataReader.NextExecPart(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.Init(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.CreateYdbDataReader(IServerStream`1 resultSetStream, Action`1 onNotSuccessStatusCode, YdbTransaction ydbTransaction, CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChangesAsync(IList`1 entries, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
Unhandled exception. Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
 ---> Ydb.Sdk.Ado.YdbException (0x80004005): Status: BadRequest, Issues:
[1030] Error: Type annotation
    [0] (26:13) Error: At function: KiWriteTable!
        [2032] (26:13) Error: Missing not null column in input: EmailConfirmed. All not null columns should be initialized
   at Ydb.Sdk.Ado.YdbDataReader.NextExecPart(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.Init(CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbDataReader.CreateYdbDataReader(IServerStream`1 resultSetStream, Action`1 onNotSuccessStatusCode, YdbTransaction ydbTransaction, CancellationToken cancellationToken)
   at Ydb.Sdk.Ado.YdbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChangesAsync(IList`1 entries, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(StateManager stateManager, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Volo.Abp.EntityFrameworkCore.AbpDbContext`1.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
   at Volo.Abp.Domain.Repositories.EntityFrameworkCore.EfCoreRepository`2.InsertAsync(TEntity entity, Boolean autoSave, CancellationToken cancellationToken)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at Volo.Abp.Identity.IdentityUserStore.CreateAsync(IdentityUser user, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Identity.UserManager`1.CreateAsync(TUser user)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at Volo.Abp.Identity.IdentityUserManager.CreateAsync(IdentityUser user, String password, Boolean validatePassword)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue`1.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at Volo.Abp.Identity.IdentityDataSeeder.SeedAsync(String adminEmail, String adminPassword, Nullable`1 tenantId, String adminUserName)
   at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous(IInvocation invocation, IInvocationProceedInfo proceedInfo)
   at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.ProceedAsync()
   at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation)
   at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter`1.InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
   at DJurist.Sro.Monitoring.Data.MonitoringDbMigrationService.SeedDataAsync(Tenant tenant) in /Users/arutunan/Repositories/DigitalJurist/djurist.sro.monitoring/aspnet-core/src/DJurist.Sro.Monitoring.Domain/Data/MonitoringDbMigrationService.cs:line 103
   at DJurist.Sro.Monitoring.Data.MonitoringDbMigrationService.MigrateAsync() in /Users/arutunan/Repositories/DigitalJurist/djurist.sro.monitoring/aspnet-core/src/DJurist.Sro.Monitoring.Domain/Data/MonitoringDbMigrationService.cs:line 53
   at DJurist.Sro.Monitoring.DbMigrator.DbMigratorHostedService.StartAsync(CancellationToken cancellationToken) in /Users/arutunan/Repositories/DigitalJurist/djurist.sro.monitoring/aspnet-core/src/DJurist.Sro.Monitoring.DbMigrator/DbMigratorHostedService.cs:line 36
   at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>b__14_1(IHostedService service, CancellationToken token)
   at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
   at Microsoft.Extensions.Hosting.Internal.Host.<StartAsync>g__LogAndRethrow|14_3(<>c__DisplayClass14_0&)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at DJurist.Sro.Monitoring.DbMigrator.Program.Main(String[] args) in /Users/arutunan/Repositories/DigitalJurist/djurist.sro.monitoring/aspnet-core/src/DJurist.Sro.Monitoring.DbMigrator/Program.cs:line 28
   at DJurist.Sro.Monitoring.DbMigrator.Program.<Main>(String[] args)

Other information:

Может ли быть это связано с тем, что я использую .NET 9, а EntityFrameworkCore.Ydb версии 0.1.0 ориентирован на .NET 8?
Спасибо за помощь!

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions