当我尝试更新实体时,EF6引发EntityValidationErrors异常

时间:2019-05-22 03:39:25

标签: c#

我在EF6中更新实体时遇到问题。代码如下:

public PICCOSSourceCost GetCOSSourceCost(int sourceCostID)
{
    return ERPContext.PICCOSSourceCost.Where(sc => sc.ID == sourceCostID && !sc.Deleted).FirstOrDefault();
}
public PICCOSSourceCost UpdateCOSSourceCost(PICCOSSourceCost sourceCost, bool saveChanges = true)
{
    var sc = GetCOSSourceCost(sourceCost.ID);
    if (sc == null)
    {
        throw new PICObjectNotFoundException<PICCOSSourceCost>(sourceCost, new List<string>()
        {
            nameof(PICCOSSourceCost.PICCOSSourceID),
            nameof(PICCOSSourceCost.PICCOSPriceTypeID),
            nameof(PICCOSSourceCost.Price),
            nameof(PICCOSSourceCost.EffectiveDate)
        });
    }

    sc.PICCOSSourceID = sourceCost.PICCOSSourceID;
    sc.PICCOSPriceTypeID = sourceCost.PICCOSPriceTypeID;
    sc.Price = sourceCost.Price;
    sc.EffectiveDate = sourceCost.EffectiveDate;
    sc.Deleted = sourceCost.Deleted;
    sc.CreatedBy = sourceCost.CreatedBy;
    sc.CreatedDate = sourceCost.CreatedDate;
    sc.LastModifiedBy = sourceCost.LastModifiedBy;
    sc.LastModifiedDate = sourceCost.LastModifiedDate;

    if (saveChanges) ERPContext.SaveChanges();

    return sc;
}

如您所见,“ GetCOSSourceCost”方法从EF获取实体。 “ UpdateCOSSourceCost”方法中的第一个参数“ sourceCost”是从FrontEnd传入的,该参数也是从EF6中获得的。 当我调试代码时,发生了“ System.Data.Entity.Validation.DbEntityValidationException”。我不知道为什么我认为应该没问题,因为我只是获得一个实体对象,然后更改其属性并保存更改。是否因为有两个引用相同的对象? 如果删除属性分配代码,该错误将消失。

  

一个或多个实体的验证失败。有关更多详细信息,请参见“ EntityValidationErrors”属性。

您知道为什么会引发此异常吗?请帮我。非常感谢!

2 个答案:

答案 0 :(得分:1)

基于此

http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/

您可以使用的是特殊的调试器变量-$exception

要查看EntityValidationErrors集合,您可以在下面使用它来显示监视窗口

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

答案 1 :(得分:0)

非常感谢您的帮助。我已通过以下链接解决了我的问题: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details 为了这个链接,我调试并找到了实体验证错误的根本原因。一些必填字段设置为NULL值。 答案中的代码非常有用:

try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges
    context.SaveChanges();
}
catch (DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}