27

Asp.net mvc Web アプリケーション内に次の Action メソッドがあります。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(SDJoin sdj, FormCollection formValues)
{
    Try
    {
        //code goes here
        repository.InsertOrUpdateSD(sdj.StorageDevice, User.Identity.Name, assetid);
        repository.Save();
    }
    catch (Exception ex)
    {
        //code goes here
    }
    PopulateViewBagData();
    return View(sdj);
}

次のメソッドを呼び出します:-

public void InsertOrUpdateSD(TMSStorageDevice sd, string username, long assetid)
{
    var resource = entities.Resources.AsNoTracking().SingleOrDefault(a => a.RESOURCEID == assetid);
    if (sd.TMSStorageDeviceID == default(int))
    {
        // New entity
        int technologyypeID = GetTechnologyTypeID("Storage Device");
        Technology technology = new Technology
        {
            IsDeleted = true,
            IsCompleted = false,
            TypeID = technologyypeID,
            Tag = "SD" + GetTagMaximumeNumber2(technologyypeID).ToString(),
            StartDate = DateTime.Now,
            IT360ID = assetid
        };

        InsertOrUpdateTechnology(technology);
        Save();

        sd.TMSStorageDeviceID = technology.TechnologyID;
        tms.TMSStorageDevices.Add(sd);
    }
}

私のモデルクラスは次のとおりです:-

public partial class TMSStorageDevice
{
    public int TMSStorageDeviceID { get; set; }
    public string Name { get; set; }
    public Nullable<decimal> size { get; set; }
    public int RackID { get; set; }
    public string CustomerName { get; set; }
    public string Comment { get; set; }
    public byte[] timestamp { get; set; }

    public virtual Technology Technology { get; set; }
    public virtual TMSRack TMSRack { get; set; }
}

しかし、Create アクション メソッドを呼び出すと、次の例外が発生します。

System.Data.Entity.Validation.DbEntityValidationException was caught
  HResult=-2146232032
  Message=Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.Internal.InternalContext.SaveChanges()
       at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
       at System.Data.Entity.DbContext.SaveChanges()
       at TMS.Models.Repository.Save() in c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Models\Repository.cs:line 1926
       at TMS.Controllers.StorageDeviceController.Create(SDJoin sdj, FormCollection formValues) in c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TMS\TMS\Controllers\StorageDeviceController.cs:line 160
  InnerException:

コードを再確認すると、すべてが正常に機能するはずなので、誰が何が間違っているのかアドバイスできますか? ありがとう

4

3 に答える 3

7

質問が古いことはわかっていますが、誰かがこれも役立つことを願っています。

  1. 最も可能性が高い (実際、コメントから判断すると)エラーは、変数がモデルの検証に合格しなかったことです。
  2. (コードを変更せずに)表示できなかったエラーを表示するもう 1 つの方法は、QuickWatch ウィンドウを使用して例外を表示することです。問題は、例外のツールチップから開くことができる [詳細の表示] ウィンドウに EntityValidationErrors が表示されないことです。また、catch ブロックがないと、QuickWatch で確認できる例外変数がありません。幸いなことに、QuickWatch には PseudoVariables があります。 したがって、「$exception」疑似変数を使用すると、QuickWatch ウィンドウで現在未処理の例外を簡単に確認できます。(以下のスクリーンショットを参照してください) $exception 疑似変数を使用した[Exception Details] ウィンドウ[QuickWatch ] ウィンドウ
于 2015-10-21T16:39:05.887 に答える
1

これは古い投稿ですが、このアプローチはより実り多いものになる可能性があります!

クレジット

このようなことを試してください

        try
        {
            pcontext.SaveChanges();
        }
       catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException ex)
        {             
             Console.WriteLine(ex.InnerException);
        }
        catch (System.Data.Entity.Core.EntityCommandCompilationException ex)
        {
          Console.WriteLine(ex.InnerException);
        }
        catch (System.Data.Entity.Core.UpdateException ex)
        {
         Console.WriteLine(ex.InnerException);
        }

        catch (System.Data.Entity.Infrastructure.DbUpdateException ex) //DbContext
        {
            Console.WriteLine(ex.InnerException);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException);
            throw;
        }
于 2017-04-20T12:39:51.713 に答える