我正在更新两个相关的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 _711.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。
我不能为我的生活弄清楚为什么会这样。
答案 0 :(得分:0)
问题不在于您要更改的任何值。实际上,您的新值在设置它们的位置是非可空类型。
由于失败的数据类型是Int16
,我会检查所有映射到short
的值,以查找映射到可空列的任何非可空属性。