无法将对象从DBNull强制转换为其他类型的Entity Framework

时间:2011-04-22 18:19:19

标签: c# asp.net linq-to-sql entity-framework-4

我正在更新两个相关的Entity对象,我们称之为Order和OrderDetails。除主要字段外的每个字段都可以在数据库中为空。

以下是代码段:

ClientEntities ce = new ClientEntities();
    Order order = (from p in ce.Orders
                                 where p.OrderID == OrderID                                
                                 select p).FirstOrDefault();

    decimal discountpercent = decimal.Parse(rntb_DiscountPercent.DbValue.ToString());

                        foreach (OrderDetail oDetail in order.OrderDetails)
                        {
                            decimal listprice = iDetail.PurchasedItem.ListPrice.GetValueOrDefault();
                            decimal discountvalue = listprice * (discountpercent / 100);
                            decimal paidprice = Decimal.Round(listprice - discountvalue, 2);

                            oDetail.ClientAmountReceived = paidprice;
                        }
                        order.DiscountPercent = rntb_DiscountPercent.Value;
                        ce.SaveChanges(); 

当上下文提交对db的更改时,我收到以下错误:

  

System.InvalidCastException:Object   不能从DBNull转换为其他   类型。

at System.DBNull.System.IConvertible.ToInt16(IFormatProvider
     

提供商)       在System.Convert.ChangeType(Object   value,类型conversionType,   IFormatProvider提供商)       在System.Data.Mapping.Update.Internal.Propagator.Evaluator.Cast(Object   value,Type clrPrimitiveType)       在System.Data.Mapping.Update.Internal.Propagator.Evaluator.Visit(DbCastExpression)   节点)       在System.Data.Common.CommandTrees.DbCastExpression.Accept [TResultType](DbExpressionVisitor 1 visitor) at System.Data.Mapping.Update.Internal.Propagator.Evaluator.Evaluate(DbExpression node, PropagatorResult row, Propagator parent) at System.Data.Mapping.Update.Internal.Propagator.Project(DbProjectExpression node, PropagatorResult row, TypeUsage resultType) at System.Data.Mapping.Update.Internal.Propagator.Visit(DbProjectExpression node) at System.Data.Common.CommandTrees.DbProjectExpression.Accept[TResultType](DbExpressionVisitor 1   游客)       在System.Data.Mapping.Update.Internal.Propagator.Propagate(UpdateTranslator)   parent,EntitySet表,   DbQueryCommandTree umView)       在System.Data.Mapping.Update.Internal.UpdateTranslator.d_ 0.MoveNext()       在System.Linq.Enumerable.d _71 1.MoveNext() at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable 1   命令,UpdateTranslator翻译器)       在System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands()       在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager)   stateManager,IEntityAdapter适配器)       在System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager   entityCache)       在System.Data.Objects.ObjectContext.SaveChanges(SaveOptions   选项)       在System.Data.Objects.ObjectContext.SaveChanges()       在BSpace.InvoicePage.lbtn_CalculateDiscount_Click(对象   o,EventArgs e)in   C:\项目\客户端\干线\客户端   应用\来源\ ClientProject \ OrderPage.aspx.cs:行   1069       在System.EventHandler.Invoke(对象   发件人,EventArgs e)       在System.Web.UI.WebControls.Button.OnClick(EventArgs   E)       在System.Web.UI.WebControls.Button.RaisePostBackEvent(String   eventArgument)       在System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String   eventArgument)       在System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler   sourceControl,String eventArgument)       在System.Web.UI.Page.RaisePostBackEvent(NameValueCollection   发布数据)       在System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)

在数据库中,Orders.DiscountPercent是(float,null),OrderDetails.ClientAmountReceived是(money,null)。

不确定为什么会发生这种情况,因为这些是我正在更新的唯一两个字段。我已经尝试确保每个字段中都有数据但仍然会出现此错误。我还检查了数据模型文件,以确保所有关联字段的表映射都是正确的。 OrderDetails.ClientAmountReceived转换为Nullable,Order.DiscountPercent转换为Nullable。

我不能为我的生活弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:0)

问题不在于您要更改的任何值。实际上,您的新值在设置它们的位置是非可空类型。

由于失败的数据类型是Int16,我会检查所有映射到short的值,以查找映射到可空列的任何非可空属性。