2011-04-22 5 views
1

두 개의 관련 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_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)

을입니다 (부동 소수점 아래

는 코드입니다 , null)이고 OrderDetails.ClientAmountReceived는 (money, null)입니다.

업데이트하는 유일한 두 필드이기 때문에 왜 이런 일이 발생하는지 잘 모르겠습니다. 모든 필드에 데이터가 있는지 확인하려고 시도했지만 여전히이 오류가 발생합니다. 또한 데이터 모델 파일을 검사하여 테이블 매핑이 관련된 모든 필드에 대해 올바른지 확인했습니다. OrderDetails.ClientAmountReceived는 Nullable로 변환되고 Order.DiscountPercent는 Nullable로 변환됩니다.

저는 왜 이런 일이 일어나고 있는지 알지 못합니다.

답변

0

문제는 변경중인 값에 없습니다. 실제로 새 값은 설정되는 곳의 nullable이 아닌 유형입니다.

실패한 데이터 유형이 Int16이므로 short 값에 대한 모든 매핑을 확인하여 nullable 열에 매핑되는 nullableable 속성을 찾습니다.

+0

나는 실제로 그것을 확인했습니다. Entity 테이블 매핑에 들어가서 그 값을 nullable로 만들었습니다. 성공하지 못했습니다. Entity의 테이블 매핑이 Nullable 속성을 명시 적으로 설정하지는 않았지만 Model.Designer.cs의 정의를 기반으로 응용 프로그램의 'short?'형식으로 입력됩니다. –

관련 문제