2011-04-22 92 views
1

我正在更新两个相关的实体对象,我们可以称它们为Order和OrderDetails。除主要字段外的每个字段都可以在数据库中为空。对象不能从DBNULL转换为其他类型实体框架

下面的代码片段:

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(); 

当上下文去更改提交到数据库,我得到了以下错误:

System.InvalidCastException: Object cannot be cast from DBNull to other types.

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

provider) at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at System.Data.Mapping.Update.Internal.Propagator.Evaluator.Cast(Object value, Type clrPrimitiveType) at System.Data.Mapping.Update.Internal.Propagator.Evaluator.Visit(DbCastExpression node) at 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 visitor) at System.Data.Mapping.Update.Internal.Propagator.Propagate(UpdateTranslator parent, EntitySet table, DbQueryCommandTree umView) at System.Data.Mapping.Update.Internal.UpdateTranslator.d_0.MoveNext() at System.Linq.Enumerable.d_71 1.MoveNext() at System.Data.Mapping.Update.Internal.UpdateCommandOrderer..ctor(IEnumerable 1 commands, UpdateTranslator translator) at System.Data.Mapping.Update.Internal.UpdateTranslator.ProduceCommands() at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Objects.ObjectContext.SaveChanges() at BSpace.InvoicePage.lbtn_CalculateDiscount_Click(Object o, EventArgs e) in C:\Projects\Client\trunk\Client Application\Source\ClientProject\OrderPage.aspx.cs:line 1069 at System.EventHandler.Invoke(Object sender, EventArgs e) at System.Web.UI.WebControls.Button.OnClick(EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

在数据库Orders.DiscountPercent是(浮充,null)和OrderDetails.ClientAmountReceived是(money,null)。

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

我不能为我的生活弄清楚为什么会发生这种情况。

回答

0

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

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

+0

我已经检查过。我进入Entity表映射并强制这些值为空,但没有成功。看起来Entity的表映射没有明确设置Nullable属性,但类型仍然基于Model.Designer.cs中的定义从应用程序中以“short?”的形式出现。 – 2011-04-22 20:50:08

相关问题