【发布时间】: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