这是我在这里发表的第一篇文章,如果有遗漏的信息,请原谅……:)
我正在使用 MySql.EntityFrameworkCore (7.0.2) 编写 .NET 7 AspNET API。
当我尝试使用生成的迁移(使用 dotnet ef)更新数据库时遇到问题
这是接收到的堆栈跟踪:
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();
}
我尝试通过谷歌搜索该问题来遵循一些提示,但没有任何效果对我有用。
我尝试将每个属性都作为不可为空的属性传递。
我不明白为什么在数据库更新时出现此错误...
我很乐意得到一些帮助,因为我有点迷失了:)
谢谢!
最佳答案
我发现了这个问题...
原来我使用的是 MySql.EntityFrameworkCore 包,该包维护得不好。
我切换到 Pomelo.EntityFrameworkCore.MySql 这解决了我的问题。
关于c# - MySQL.EntityFrameworkCore : Object cannot be cast from DBNull to other types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76442460/