C# SaveChanges()上的验证错误

C# SaveChanges()上的验证错误,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,我的Asp.net mvc web应用程序中有以下操作方法:- [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(SDJoin sdj, FormCollection formValues) { Try { //code goes here repository.InsertOrUpdateSD(sdj.StorageDevice, User.Identity.Name

我的Asp.net mvc web应用程序中有以下操作方法:-

[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; }
}
有谁能告诉我哪里出了问题,因为我反复检查了我的代码,每件事情都应该正常工作?
谢谢

您没有显示
Save()
方法,但是如果您可以向其中添加这样的代码,您将得到一个异常,其中包含您要查找的所有详细信息

try
{
    _context.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
    Exception raise = dbEx;
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            string message = string.Format("{0}:{1}", 
                validationErrors.Entry.Entity.ToString(),
                validationError.ErrorMessage);
            // raise a new exception nesting
            // the current instance as InnerException
            raise = new InvalidOperationException(message, raise);
        }
    }
    throw raise;
}

我知道这个问题现在已经过时了,但我希望有人也会觉得这个问题有用

  • 最有可能(事实上,根据您的评论判断)错误是您的变量未通过模型验证。
  • 查看无法看到的错误的另一种方法(不更改代码)是使用QuickWatch窗口查看异常。问题在于,您可以从异常工具提示打开的“查看详细信息”窗口不显示EntityValidationErrors。如果没有catch块,您就没有任何可以在QuickWatch中查看的异常变量。幸运的是,QuickWatch有伪变量。 因此,使用“$exception”伪变量,您可以在QuickWatch窗口中轻松查看当前未处理的异常。(请参见下面的屏幕截图) 及

  • 虽然这是一个老帖子,但这种方法可以更富有成效

    试试这样的

            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;
            }
    

    您是否“查看了
    EntityValidationErrors
    属性以了解详细信息”?它显示了一个错误,其描述为“System.Data.Entity.Validation.DbEntityValidationResult}”查看
    ValidationErrors
    属性应该可以确切地告诉您问题所在。没有ValidationErrors部分。在方法
    InsertOrUpdateSD
    中捕获对象
    DbEntityValidationException
    。这会帮助你找到验证错误。谢谢兄弟。今天帮我省了很多时间。如果没有你的回答,那就不容易了。我通常不会写评论只是为了说声谢谢,但这次我会破例。非常感谢你!你救了我一个大麻烦:)@qujckI第二个是@KorayDurudogan说的。这非常有帮助。非常感谢!!简直就是第二次用这个!非常好的回答!!伟大的工作,否则我将无法找到千年虫!!赞成他的想法。解决了我的问题
            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;
            }