我在我的应用程序中使用entityframework codefirst。
我有2张桌子:
1.Order
2.Orderdetails
我想从表单中收集数据并将其保存在这两个表中的一个操作中。
我的表单使用名为“OrderViewModel”的视图模型
我想在用户点击提交时将数据保存在“订单”表和“订单结束”表中。但我有错误:
传递到字典中的模型项的类型为
'Amooshahryar.Models.Order',但这本词典需要一个模型项目 类型'Amooshahryar.Models.ViewModels.OrderViewModel'。
我的表单使用'Amooshahryar.Models.ViewModels.OrderViewModel'并且在actionresult中我想在Order表中保存数据使用'Amooshahryar.Models.Order'。
我不明白什么是问题。
这是我的代码:
public ActionResult آدرس_و_پرداخت(FormCollection values)
{
var order = new Order() {};
TryUpdateModel(order);
int totalcartprice = 0;
try
{
order.Username = User.Identity.Name;
order.OrderDate = DateTime.Now;
order.DeliveryStatusID = 1;
TryUpdateModel(order);
//Save Order
db.Orders.Add(order);
db.SaveChanges(); <===========here i get error
//Process the order
//And rest of the code that i havent write here
}
catch
{
//Invalid - redisplay with errors
return View(order);
}
}
任何帮助都是适当的...
谢谢。
编辑:
这是我的堆栈跟踪:
[InvalidOperationException:传递到字典中的模型项的类型为'Amooshahryar.Models.Order',但此字典需要类型为'Amooshahryar.Models.ViewModels.OrderViewModel'的模型项。 System.Web.Mvc.ViewDataDictionary
1.SetModel(Object value) +378 System.Web.Mvc.ViewDataDictionary.set_Model(Object value) +47 System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +614 System.Web.Mvc.ViewDataDictionary
1..ctor(ViewDataDictionary viewDataDictionary)+37 System.Web.Mvc.WebViewPage1.SetViewData(ViewDataDictionary viewData) +98 System.Web.Mvc.WebViewPage.set_ViewData(ViewDataDictionary value) +39 System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +425 System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +382 System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +431 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +39 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList
1个过滤器,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext controllerContext,ActionResult actionResult)+116 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +529 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList
1个过滤器,ActionResult actionResult)+106 System.Web.Mvc.Async。&lt;&gt; c__DisplayClass2b.b__1c()+ 321 System.Web.Mvc.Async。&lt;&gt; c__DisplayClass21.b__1e(IAsyncResult asyncResult)+185 System.Web.Mvc.Async.WrappedAsyncResult1.CallEndDelegate(IAsyncResult asyncResult) +42 System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+133 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+56 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)+40 System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult,ExecuteCoreState innerState)+34 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +70 System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+133 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+56 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+37 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+44 System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult,Controller controller)+39 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +62 System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+133 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+56 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+37 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)+39 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult)+39 System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult,ProcessRequestState innerState)+39 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +70 System.Web.Mvc.Async.WrappedAsyncResultBase
1.End()+133 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+56 System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult,Object tag)+37 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+40 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)+38 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+ 9748493 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)+48 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+159
答案 0 :(得分:1)
这就是发生的事情:
1)您的db.SaveChanges由于某种原因失败,并抛出异常。
2)因此,代码移动到Catch块。
3)您忽略该异常,并尝试执行return语句。不幸的是,你的return语句也失败了,因为你传递了错误类型的对象。然后,这会产生您在屏幕上看到的异常,因为它没有被捕获。
不要像这样压缩异常。如果发生异常,那是因为发生了异常情况并且实际上出现了问题,因此应用程序崩溃是正常的。不要隐藏它,请始终记录并进行调查。 Try-catch仅用于捕获不可避免的异常。数据库崩溃不应该是不可避免的,它应该是不寻常的。此外,如果您在catch中的return语句成功,则用户不会得到任何反馈,表明存在问题,并且不知道为什么他们会再次出现在同一个屏幕上。与此同时,您作为开发人员不会注意到您的应用程序已损坏