0

次の POST 編集アクション メソッドがあります。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(RackJoin rj,FormCollection formValues)
{
    try
    {
        if (ModelState.IsValid)
        {
            repository.InsertOrUpdateRack(rj.Rack, User.Identity.Name, rj.Resource.RESOURCEID);
            repository.Save();
            return RedirectToAction("Index");
        }

    }
    catch (DbUpdateConcurrencyException ex)
    {
        var entry = ex.Entries.Single();
        var databaseValues = (Rack)entry.GetDatabaseValues().ToObject();
        var clientValues = (Rack)entry.Entity;
        var entry2 = ex.Entries.Single();
        var databaseValues2 = (Resource)entry2.GetDatabaseValues().ToObject();
        var clientValues2 = (Resource)entry2.Entity;

        if (databaseValues.RU != clientValues.RU)
            ModelState.AddModelError("Rack.RU", "Current value: "
                + databaseValues.RU);

しかし、DbUpdateConcurrencyException 例外が発生すると、次のコード行で次の例外が発生しますvar databaseValues2 = (Resource)entry2.GetDatabaseValues().ToObject();:-

Unable to cast object of type 'System.Data.Entity.DynamicProxies.Rack_81556130B3DB7E3D4F63B9FF3F15832A81A86055EED840211E95A71E1342027D' to type 'TMS.Models.Resource'. 
  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.InvalidCastException: Unable to cast object of type 'System.Data.Entity.DynamicProxies.Rack_81556130B3DB7E3D4F63B9FF3F15832A81A86055EED840211E95A71E1342027D' to type 'TMS.Models.Resource'.

Source Error: 



Line 175:                var clientValues = (Rack)entry.Entity;
Line 176:                var entry2 = ex.Entries.Single();
Line 177:                var databaseValues2 = (Resource)entry2.GetDatabaseValues().ToObject();
Line 178:                var clientValues2 = (Resource)entry2.Entity;
Line 179:


 Source File:  c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Controllers\RackController.cs    Line:  177 

Stack Trace: 



[InvalidCastException: Unable to cast object of type 'System.Data.Entity.DynamicProxies.Rack_81556130B3DB7E3D4F63B9FF3F15832A81A86055EED840211E95A71E1342027D' to type 'TMS.Models.Resource'.]
   TMS.Controllers.RackController.Edit(RackJoin rj, FormCollection formValues) in c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Controllers\RackController.cs:177
   lambda_method(Closure , ControllerBase , Object[] ) +245
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +59
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +435
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +60
   System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeSynchronousActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +50
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +75
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +44
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +139
4

1 に答える 1

1

コードのこのセクションで何が起こっているのか完全にはわかりませんResource。コメントで言及した2番目のコンテキストから取得するつもりですか?

 var entry = ex.Entries.Single();
 var databaseValues = (Rack)entry.GetDatabaseValues().ToObject();
 var clientValues = (Rack)entry.Entity;

 var entry2 = ex.Entries.Single();
 var databaseValues2 = (Resource)entry2.GetDatabaseValues().ToObject();
 var clientValues2 = (Resource)entry2.Entity;

Single()複数の要素を含むシーケンスを呼び出すと、例外が生成されます。は例外を生成していないためSingle、両方のケースで使用しているエントリが 1 つしかありません。

最初は、それを として扱いたいと考えていますがRack、これは苦情を生成していないようです。2 番目の例では、苦情の原因であるResourceと互換性がないように思われるとして扱っています。Rack

InvalidCastException: Unable to cast object of type 'System.Data.Entity.DynamicProxies.Rack_81...' to type 'TMS.Models.Resource'.]

例外にその特定のエンティティのみが含まれる理由は、InsertOrUpdateRackメソッドで見つかる可能性があります。

于 2013-08-05T13:07:36.117 に答える