【问题标题】:EF Core MySQL - Can't map DBnull valuesEF Core MySQL - 无法映射 DBnull 值
【发布时间】:2022-01-25 16:50:16
【问题描述】:

我有一个似乎无法解决的问题。我正在更新基于现有 MySQL 数据库的应用程序。我正在使用 EF Core 6.0.1 和 Pomelo.EntityFrameworkCore.MySql 6.0.0

我可以轻松地从表中检索数据,因此我知道设置正在运行。但是 - 当我尝试将实体映射到 MySql 中包含可为空值的表时,EF Core 会引发错误:

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

一个简短的例子可能是这个类:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; };
}

映射到 MySQL 中的一个表:

CREATE TABLE `Users` (
    `Id` INT(11) NOT NULL,
    `Username` VARCHAR(50) NULL DEFAULT NULL,
    `Email` VARCHAR(200) NULL DEFAULT NULL,
    PRIMARY KEY (`Id`) USING BTREE
;

我有以下映射:

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.ToTable("Users");
    builder.HasKey(o => o.Id);
    builder.Property(t => t.Username).HasColumnType("varchar").HasMaxLength(50);
    builder.Property(t => t.Email).HasColumnType("varchar");
}

在当前示例中,用户名和电子邮件字段可以在数据库中包含空值(它们确实如此)。 如果我从课堂上删除用户名和密码,那么一切正常。但是每当我尝试映射一个可为空的类型时,我都会得到 DBnull 异常。

我对在 MySQL 中使用 EF 非常陌生 - 所以我认为可能缺少一些东西? :)

【问题讨论】:

  • 尝试使用可空指令string?
  • @SvyatoslavDanyliv 我完全忘记了可空引用类型!添加字符串后?类型 - 一切都走到了一起。感谢您的帮助!
  • @GertArnold - 良好的链接。我检查了我的 csproj 文件以确定 - 但该链接肯定会为某些人节省一些麻烦 :)

标签: mysql entity-framework-core


【解决方案1】:

根据下面@GertArnold 和@SvyatoslavDanyliv 的cmets,我通过执行以下操作解决了我的问题:

  1. 确保我的 csproj 文件有 &lt;Nullable&gt;enable&lt;/Nullable&gt;
  2. 使用string? 而不仅仅是string 将我的用户名和电子邮件属性设置为可为空的引用类型

立即解决所有问题。 谢谢大家。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2015-01-13
    • 2021-05-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多