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
相关产品推荐
相关产品推荐

