我正在更新两个相关的实体对象,我们可以称它们为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