c# - MySQL.EntityFrameworkCore : Object cannot be cast from DBNull to other types

标签 c# mysql entity-framework asp.net-web-api

这是我在这里发表的第一篇文章,如果有遗漏的信息,请原谅……:)

我正在使用 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/

相关文章:

c# - 在 XAML 应用程序中引用 C++ 组件

c# - Entity Framework Core - 多个 DbContext 单数据库

c# - 如何将 Entity Framework 类属性标记为 'Obsolete'

c# - 无法将类型 ApplicationUser 隐式转换为 User

c# - 是否有 .NET 方法来获取 Entity Framework 连接字符串的数据源?

c# - 为什么 Type.GetFields() 不返回基类中的支持字段?

mysql - InnoDB 导出损坏

php - MySQL SHOW COLUMNS 意外行为

mysql - 数据库表可以没有主键吗?

c# - SQlite 连接中的非法字符 (C#)