【发布时间】:2020-10-31 16:23:28
【问题描述】:
我的问题是:
如何从 SQL Server 返回的记录中调试 映射过程,因为它被映射到类对象,以便我可以准确地知道哪个类属性是失败了?
背景:
从 SQL Server 返回数据时出错,因为它尝试将 sql 数据映射到对象。我正在使用 Entity Framework 6 和 Automapper 投影来获得它的价值。
我得到的错误是The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.。
我知道这意味着 SQL 中的一列正在返回 NULL,它试图映射到 int 中的类属性且不可为空 .但是,你怎么知道哪个属性有问题?
EF 创建的查询非常庞大(1,250 行),其中包含许多通用列,例如 C1、C2 等。看起来列顺序,对于它返回的命名列是按字母顺序排列的的...所以我获取了所有类属性并按字母顺序对它们进行排序,以查看它们是否与列顺序匹配...它们确实可以,但不是 100%...加上该类继承自另一个...不确定它是否包括那些在 alpha 排序中,或者在末尾等。
无论如何,这是我试图找出问题所在。该查询确实有几个为空的字段,但有很多字段和许多字符串和可为空的 int 等,所以这些可能是有效的。甚至试图弄清楚 C1 列是否返回 null,对于这个非常大的查询和一个包含 80 多个字段的类,它试图映射到哪个实际属性几乎是不可能的。
有没有办法分解 sql 到对象的映射以确切知道哪个属性是问题所在?
【问题讨论】:
-
我可能过于简化了,但这应该是设计驱动的。实际数据与您的代码冲突,因此我认为您需要重新审视设计,并使任何可以为空的字段都可以为空。
-
@Jamal,我在 SQL Profiler 中这样做了,但是结果有很多通用列(即
[Project1].[C1])被返回,所以很难知道哪个列映射到哪个@987654330 @类属性。 -
@ChiefTwoPencils 是的,或者修复查询以返回值而不是 null。但是如果我不能确定哪一列是返工的问题,我就不能这样做:)
-
@Chad,我认为以下内容可能会有所帮助:entityframework.net/how-to-see-ef-errors。
标签: c# sql-server entity-framework linq-to-sql