赞
踩
[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
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,也未能找到有效的解决方案,我已经处在崩溃的边缘,就差一根导火索了。
打开实体类的定义,我两眼已经发直,这 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>
c# 引用的 可空引用类型是个好东西!
一旦启用了可空引用类型这个新特征,引用类型将默认被视为不可空,无法赋予null,除非手工将它设为可空引用类型, 这样我们在项目的类库中就可以安全定义输入输出参数了。
然而,在EF Model库内,如果有此定义,那么实体类型需要严格定义是否为空,一不小心,就酿成今天之坑~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。