EF Core Error:Unable to cast object of type ‘System.DBNull‘ to type ‘System.String‘

[ExceptionMessage]:Unable to cast object of type ‘System.DBNull’ to type ‘System.String’.\r\n\t[ExceptionStackTrace]: at MySqlConnector.Core.Row.GetString(Int32 ordinal) in /_/src/MySqlConnector/Core/Row.cs:line 371\r\n

1. EF Core错误排查

EF Core框架是微软的.NET框架的最重要的ORM(对象关系映射)框架,其支持丰富的数据库类型,从微软的Sql Server 到Oracle的MySql,其都有丰富的支持,而今天,一不小心又掉到坑里了,大家赶快来观赏下。

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

该错误,一般是由于 在EF映射时,执行了 IsRequired()导致,删除 .IsRequired()即可.

然而,本次的坑并非 .IsRequired()引起,我的EF映射如下:

 entity.Property(e => e.Age)
.HasColumnType("int(11)")
   .HasComment("年龄");

entity.Property(e => e.Avatar)
   .HasColumnType("varchar(255)")
   .HasComment("头像")   ;

查询数据库数据如下:
在这里插入图片描述
是的, 在Avatar 里有2条数据的 值为 NULL, 在我手工修改为 非NULL后,查询语句得以修复。

遍查度娘而不得,爬到google,也未能找到有效的解决方案,我已经处在崩溃的边缘,就差一根导火索了。

2.神奇的?

打开实体类的定义,我两眼已经发直,这 tnd没道理啊!

正在我走投无路之际, 忽然就给string加了个 ?,这是出于啥目的, 已不可考。
把下面的代码修改了下

/// <summary>
  /// 头像
  /// </summary>
  public string Avatar { get; set; }

变成了

/// <summary>
  /// 头像
  /// </summary>
  public string? Avatar { get; set; }

再次访问,我XXX,好了。 什么鬼啊?难道是我启用了 C#的新特性 空引用类型?

打开Model的项目文件, 赫然出现了Nullable的定义

<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
     <Nullable>annotations</Nullable>
 </PropertyGroup>

原来这里启用了空引用类型, 老天哎, 我关关关~~~~

<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
    <Nullable>disable</Nullable>
</PropertyGroup>

3. 小结

c# 引用的 可空引用类型是个好东西!

一旦启用了可空引用类型这个新特征,引用类型将默认被视为不可空,无法赋予null,除非手工将它设为可空引用类型, 这样我们在项目的类库中就可以安全定义输入输出参数了。

然而,在EF Model库内,如果有此定义,那么实体类型需要严格定义是否为空,一不小心,就酿成今天之坑~~~

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webmote

如果能帮到你,请支持下博主

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值