我正在更新兩個相關的實體對象,我們可以稱它們爲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_711.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。
我不能爲我的生活弄清楚爲什麼會發生這種情況。
我已經檢查過。我進入Entity表映射並強制這些值爲空,但沒有成功。看起來Entity的表映射沒有明確設置Nullable屬性,但類型仍然基於Model.Designer.cs中的定義從應用程序中以「short?」的形式出現。 – 2011-04-22 20:50:08