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

Posted webmote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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库内,如果有此定义,那么实体类型需要严格定义是否为空,一不小心,就酿成今天之坑~~~

以上是关于EF Core Error:Unable to cast object of type ‘System.DBNull‘ to type ‘System.String‘的主要内容,如果未能解决你的问题,请参考以下文章

idea下git 错误 error: unable to read askpass response from 'C:UsersASUS.IntelliJIdea2019.1syste

error rabbitMQ:Error: unable to perform an operation on node 'rabbit@xxxx'.

error: Unable to find vcvarsall.bat

pip install scrapy报错:error: Unable to find vcvarsall.bat解决方法

[nodejs] Error: unable to verify the first certificate

Fatal error: Unable to find local grunt.