错误的可能原因:“转换为值类型'Decimal'失败,因为具体化值为null”

时间:2011-04-18 04:40:59

标签: .net sql-server entity-framework sql-server-2008 entity-framework-4

我收到了生产系统错误的报告。我无法轻松访问生产系统。我将在适当的时候获得我需要的所有数据,但我正在尝试做的是加快解决此问题的过程。我试图消除尽可能多的猜测。

错误我得到了这个:

  

扩展属性:异常 - System.InvalidOperationException:The   转换为值类型'Decimal'失败   因为物化价值是   空值。结果类型的通用   参数或查询必须使用a   可空类型。

发生错误的代码是:

IQueryable<AccountStatusModel> result = from d in Context.Debtors
    where // Condition here
    select new AccountStatusModel
    {
         // All of the below are decimal in the AccountStatusModel
         // and all of them are decimal NOT NULL in the database
         NotYetDue = d.sometable.dbcurrent,
         DueThisMonth = d.sometable.dbprd1bal,
         Overdue = d.sometable.dbprd2bal
                + d.sometable.dbprd3bal
                + d.sometable.dbprd4bal
                + d.sometable.dbprd5bal
                + d.sometable.dbprd6bal,
         PaymentRecievedNotAllocated = d.sometable.dbunalloc,
         OutstandingOrders = d.dmoutordval ?? 0,
         TotalBalance = d.sometable.dbcurrent
                + d.sometable.dbprd1bal
                + d.sometable.dbprd2bal
                + d.sometable.dbprd3bal
                + d.sometable.dbprd4bal
                + d.sometable.dbprd5bal
                + d.sometable.dbprd6bal
                + d.sometable.dbunalloc
                + (d.dmoutordval ?? 0),
         CreditLimit = d.dmcredlim,
         LastPayment = d.dmvallastpaid,

         // Some other properties here
         // ....
    };

在有人评论字段名称之前,假设这些是假名。 =) 请注意,要查询的所有数据库字段都不是NULL。

我无法在开发环境中重现此错误。

我认为,这个错误在PROD中发生的原因是因为不知何故,在被查询的字段中,一个被标记为NULL。我没有快速检查这个,但我最终会。

我现在的问题是:这个错误还有其他原因吗?如果查询如上所述,是否可能出现此错误,并且字段确实是非NULL。 (为什么?)如果有可能请提供一个例子。

请回答,如果你肯定你是对的,即我需要更强的东西,而不是“我认为就是这样”。

2 个答案:

答案 0 :(得分:1)

正如我在对GregC的回答中所怀疑的那样,问题在于加入。架构证明是正确的。但是,如果“sometable”没有相关“Debtors”记录的记录,那么我引用的查询可以返回空值。我这个案例d.sometable.Anything将为null。因为L2E合并了NULLS,所以它不会抱怨d.sometable为null,而只是为d.sometable.Anything返回null。

所以这是怎么回事。

答案 1 :(得分:0)

您的查询看起来不错。这里的关键是“物化”这个词,这意味着当用表中的DBNull对表格单元进行保湿时会发生异常。