2011-04-22 93 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

相關問題