You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySql.EntityFrameworkCore迁移数据库时DBNull转换异常求助

使用MySql.EntityFrameworkCore 7.0.2执行EF迁移更新数据库时遇到DBNull转换异常

首次发帖,若信息遗漏请见谅。

我在开发.NET 7 ASP.NET API时使用MySql.EntityFrameworkCore(7.0.2),执行dotnet ef database update应用迁移时遇到以下错误:

System.InvalidCastException: Object cannot be cast from DBNull to other types.
   at System.DBNull.System.IConvertible.ToInt32(IFormatProvider provider)
   at MySql.Data.MySqlClient.Driver.LoadCharacterSetsAsync(MySqlConnection connection, Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.Driver.ConfigureAsync(MySqlConnection connection, Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Boolean execAsync, CancellationToken cancellationToken)
   at MySql.Data.MySqlClient.MySqlConnection.Open()
   at MySql.EntityFrameworkCore.Storage.Internal.MySQLDatabaseCreator.<>c__DisplayClass16_0.<Exists>b__0(DateTime giveUp)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext _, TState s)
   at MySql.EntityFrameworkCore.Storage.Internal.MySQLExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation, Func`2 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, TState state, Func`2 operation)
   at MySql.EntityFrameworkCore.Storage.Internal.MySQLDatabaseCreator.Exists(Boolean retryOnNotExists)
   at MySql.EntityFrameworkCore.Storage.Internal.MySQLDatabaseCreator.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   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)
Object cannot be cast from DBNull to other types.

我的实体类定义如下:

public abstract class BaseEntity
{
    public Guid Id { get; init; } = new Guid();
}

public abstract class BaseAuditableEntity : BaseEntity
{
    public DateTime Created { get; set; }

    public DateTime LastModified { get; set; }

    public string CreatedBy { get; set; } = default!;

    public string LastModifiedBy { get; set; } = default!;
}

public class Catalog : BaseAuditableEntity
{
    private List<CatalogItem>? _catalogItems = new();

    public IEnumerable<CatalogItem> CatalogItems =>
        new ReadOnlyCollection<CatalogItem>(_catalogItems!);

    public CatalogVersion Version { get; set; } = CatalogVersion.From(1);

    public CatalogName Name { get; init; } = default!;

    public CatalogKind Kind { get; init; } = default!;

// 省略其他代码
}

public class CatalogItem : BaseAuditableEntity
{
    public Guid CatalogId { get; init; }

    public CatalogItemName Name { get; private set; } = default!;

    public CatalogItemType Type { get; private set; } = default!;

    public CatalogItemScope Scope { get; set; }

    public bool Mandatory { get; private set; }

    public string? ValidationString { get; private set; } = string.Empty;

    public string? DefaultValue { get; private set; } = string.Empty;

// 省略其他代码
}

实体配置代码:

public void Configure(EntityTypeBuilder<Catalog> catalogConfiguration)
{
    catalogConfiguration.OwnsOne(c => c.Name)
        .Property(p => p.Value).HasColumnName("Name").IsRequired();
    
    catalogConfiguration.OwnsOne(c => c.Kind)
        .Property(p => p.Value).HasColumnName("Kind").IsRequired();
    
    catalogConfiguration.OwnsOne(c => c.Version)
        .Property(p => p.Value).HasColumnName("Version").IsRequired();
}

public void Configure(EntityTypeBuilder<CatalogItem> catalogItemConfiguration)
{
    catalogItemConfiguration.OwnsOne(e => e.Name)
        .Property(p => p.Value).HasColumnName("Name").IsRequired();
    catalogItemConfiguration.OwnsOne(e => e.Scope)
        .Property(p => p.Value).HasColumnName("Scope").IsRequired();
    catalogItemConfiguration.OwnsOne(e => e.Type)
        .Property(p => p.Value).HasColumnName("Type").IsRequired();
}

我已经通过谷歌搜索尝试了多种解决方案,也将所有属性设置为非可空类型,但仍无法解决这个问题,希望能得到帮助。

内容的提问来源于stack exchange,提问作者Bryan Ryser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:17:43