두 개의 관련 Entity 개체를 업데이트하여 Order 및 OrderDetails라고 부릅니다. 기본 필드를 제외한 모든 필드는 데이터베이스에서 Nullable입니다. 문맥 나는 다음과 같은 오류 얻을 DB에 변경 사항 커밋 간다개체를 DBNull에서 다른 형식으로 캐스팅 할 수 없습니다. Entity Framework
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();
: 데이터베이스 Orders.DiscountPercent에서
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)
을입니다 (부동 소수점 아래
는 코드입니다 , null)이고 OrderDetails.ClientAmountReceived는 (money, null)입니다.업데이트하는 유일한 두 필드이기 때문에 왜 이런 일이 발생하는지 잘 모르겠습니다. 모든 필드에 데이터가 있는지 확인하려고 시도했지만 여전히이 오류가 발생합니다. 또한 데이터 모델 파일을 검사하여 테이블 매핑이 관련된 모든 필드에 대해 올바른지 확인했습니다. OrderDetails.ClientAmountReceived는 Nullable로 변환되고 Order.DiscountPercent는 Nullable로 변환됩니다.
저는 왜 이런 일이 일어나고 있는지 알지 못합니다.
나는 실제로 그것을 확인했습니다. Entity 테이블 매핑에 들어가서 그 값을 nullable로 만들었습니다. 성공하지 못했습니다. Entity의 테이블 매핑이 Nullable 속성을 명시 적으로 설정하지는 않았지만 Model.Designer.cs의 정의를 기반으로 응용 프로그램의 'short?'형식으로 입력됩니다. –