对象不能从DBNull强制转换为其他类型实体框架

本文关键字:其他 类型 实体 框架 转换 不能 DBNull 对象 | 更新日期: 2023-09-27 17:51:25

我正在更新两个相关的实体对象,让它们称为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时,我得到以下错误:

系统。InvalidCastException:对象不能从DBNull强制转换为其他类型。

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

提供者)在System.Convert.ChangeType(对象类型转换类型IFormatProvider提供者)在System.Data.Mapping.Update.Internal.Propagator.Evaluator.Cast(对象clrPrimitiveType)System.Data.Mapping.Update.Internal.Propagator.Evaluator.Visit (DbCastExpression节点)在System.Data.Common.CommandTrees.DbCastExpression。Accept[TResultType](dbeexpression visitor 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访客)System.Data.Mapping.Update.Internal.Propagator.Propagate (UpdateTranslatorparent, 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命令,UpdateTranslator(翻译)在System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands ()System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManagerstateManager, IEntityAdapterSystem.Data.EntityClient.EntityAdapter.Update (IEntityStateManagerentityCache)System.Data.Objects.ObjectContext.SaveChanges(其选项)在System.Data.Objects.ObjectContext.SaveChanges ()在BSpace.InvoicePage.lbtn_CalculateDiscount_Click(对象6、EventArgs(事件参数C: ' '客户端'树干'客户端项目应用' ' ClientProject ' OrderPage.aspx.cs来源:行1069在System.EventHandler.Invoke(对象sender, EventArgs e)System.Web.UI.WebControls.Button.OnClick (EventArgse)在System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串eventArgument)在System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串eventArgument)System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandlersourceControl, String eventparameter)System.Web.UI.Page.RaisePostBackEvent (NameValueCollectionpostData)System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)

在数据库Orders中。折扣百分比是(float, null)和OrderDetails。ClientAmountReceived是(money, null)。

不知道为什么会发生这种情况,因为这是我唯一更新的两个字段。我试着确保每个字段都有数据,但仍然得到这个错误。我还检查了数据模型文件,以确保所有关联字段的表映射都是正确的。OrderDetails。ClientAmountReceived转换为Nullable和Order。DiscountPercent转换为空值。

我怎么也弄不明白为什么会这样

对象不能从DBNull强制转换为其他类型实体框架

问题不在于您正在更改的任何值。事实上,你的新值在设置它们的地方是不可空的类型。

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