实体框架不允许在db

时间:2018-01-12 10:05:36

标签: asp.net entity-framework asp.net-mvc-4 model entity

我在我的应用程序中使用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.WebViewPage 1.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(IList 1 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.WrappedAsyncResult 1.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.WrappedAsyncVoid 1.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.WrappedAsyncVoid 1.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.WrappedAsyncVoid 1.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

1 个答案:

答案 0 :(得分:1)

这就是发生的事情:

1)您的db.SaveChanges由于某种原因失败,并抛出异常。

2)因此,代码移动到Catch块。

3)您忽略该异常,并尝试执行return语句。不幸的是,你的return语句也失败了,因为你传递了错误类型的对象。然后,这会产生您在屏幕上看到的异常,因为它没有被捕获。

不要像这样压缩异常。如果发生异常,那是因为发生了异常情况并且实际上出现了问题,因此应用程序崩溃是正常的。不要隐藏它,请始终记录并进行调查。 Try-catch仅用于捕获不可避免的异常。数据库崩溃不应该是不可避免的,它应该是不寻常的。此外,如果您在catch中的return语句成功,则用户不会得到任何反馈,表明存在问题,并且不知道为什么他们会再次出现在同一个屏幕上。与此同时,您作为开发人员不会注意到您的应用程序已损坏