如何查找无法将 DBNull 转换为 String 的列?

Posted

技术标签:

【中文标题】如何查找无法将 DBNull 转换为 String 的列?【英文标题】:How to find which column is unable to cast DBNull to String? 【发布时间】:2021-12-28 21:28:44 【问题描述】:

使用 Entity Framework 查询 mysql 数据库,我的一个表给出了错误Unable to cast object of type 'System.DBNull' to type 'System.String'. 我知道我是否能找出是哪一列给我的错误我可以修复它,但我似乎找不到任何让 EF 给我列名的方法。我检查了代码中的所有列,没有发现任何问题;数据库中的数据在必填字段中没有任何空白;我想出了如何在我的 appsettings.json 中将日志记录设置为 Trace,但除了向我显示它发送到数据库的查询之外,我看不到记录的信息有任何变化:它仍然只是说 @ 987654323@

有什么方法可以让 EF 告诉我它在哪一列有问题?我能想到的唯一下一步就是关闭 Just My Code,并希望深入研究源代码不会太混乱。

【问题讨论】:

尝试使用“可空引用类型”。允许配置您的可选字段是可空的。例如 public string FirstName get;放; // 约定要求 public string LastName get;放; // 按照惯例需要公共字符串?中间名 得到;放; // 按照惯例可选 @PrasadRamireddy 问题是我不知道哪一列设置不正确。 在 SQL 中重新创建查询并在 LinqPad 或 MSSME 等查询工具中针对您的数据库运行它。寻找意外的空值。或者尝试从查询中删除列,直到它起作用。除此之外......我们没有您的代码或数据库,我们无能为力。 @Corey:我已经编辑了问题的标题,以明确要求的帮助。 【参考方案1】:

你应该看看这个地方:https://docs.microsoft.com/en-us/ef/core/logging-events-diagnostics/

特别是我认为你会发现这个有点有用:https://docs.microsoft.com/en-us/ef/core/logging-events-diagnostics/simple-logging#detailed-query-exceptions

尝试打开详细的查询异常日志以获取更多详细信息

【讨论】:

我很乐意接受这个作为答案,但在我有机会尝试您链接中的优秀建议之前,我意外地发现了该专栏的不同方式。至少支持。【参考方案2】:

在我修复了启用可空引用类型检查时弹出的所有可空问题后,我打算尝试 T. Nielsen 的建议;但这意外地导致了另一种方法来查找未按我想象的方式设置哪一列:我在仅包含所需字段的类上设置了一个构造函数,编译器告诉我 Non-nullable property 'MyProblemColumn' must contain a non-null value when exiting constructor. Consider declaring the property as nullable. 这正是我试图找到它的原因。

【讨论】:

我很高兴你设法解决了你的问题,当我们自己找到东西时总是感觉更好。您的问题是如何让 EF 告诉您,您的“解决方案”没有解决使用 EF 的问题 :) 所以“让 EF 给我列名”的问题没有得到回答,您刚刚解决了问题 B-),虽然感谢那里的支持和快乐的编码:)

以上是关于如何查找无法将 DBNull 转换为 String 的列?的主要内容,如果未能解决你的问题,请参考以下文章

InvalidCastException:无法将“System.DBNull”类型的对象转换为“System.Nullable`1[System.Int32]”[重复]

将DBNull传递给SqlParameter时出错

如何将 Nullable DateTime 变量的 null 值转换为 DbNull.Value

[C#] 如何优雅的解决 DBNull 问题

[C#] 如何优雅的解决 DBNull 问题

从sql table处理PSCustomObject中的空值。无法转换对象