【问题标题】:troubleshooting sql to object mapping entity frameworksql 到对象映射实体框架的疑难解答
【发布时间】: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 行),其中包含许多通用列,例如 C1C2 等。看起来列顺序,对于它返回的命名列是按字母顺序排列的的...所以我获取了所有类属性并按字母顺序对它们进行排序,以查看它们是否与列顺序匹配...它们确实可以,但不是 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


【解决方案1】:

我认为你的问题可能是这样的。

您的数据库模型: public int property { get; set; }

你可能知道吗,int 是一个结构体,它的值不能为空。 在 mapper 序列化数据的地方,它会抛出一个异常,因为 DB 中的该列可能为空。

您可以检查的一件事是使 int 可以为空,如下所示: public int? property { get; set; }

也许您可以使用 SQL Server 中的 SQL Profiler 并进行检查。

【讨论】:

  • 感谢您抽出宝贵时间回复,但我的问题是关于如何确定映射中哪个属性失败。正如我所说,我知道为什么我通常会收到错误,但我正在寻找一种方法来解决映射过程本身的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多