对象不能从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_711.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转换为空值。
我怎么也弄不明白为什么会这样
问题不在于您正在更改的任何值。事实上,你的新值在设置它们的地方是不可空的类型。
由于失败的数据类型是Int16
,我会检查到short
值的所有映射,以查找映射到可空列的任何非空属性。