EntityValidationErrors报告不正确

时间:2014-07-02 12:07:40

标签: c# .net entity-framework

我有一个案例,其中entities.SaveChanges()抛出DbEntityValidationException并声明

  

AValue字段是必需的"但是已经填充了AValue属性。

是否还有其他可以检查以确定导致此错误的原因。

抛出错误的基本代码:

try
{
   var entities = new MyEntities();
   var item = (from i in entities.Item
               where i.Id == 1
               select i).First();
   item.AValue = "NewValue";
   entities.SaveChanges();
}
catch (DbEntityValidationException exception)
{
   var report = exception.Message();
}

我已经完成了一些挖掘工作并且已经完成了:

var x = item.AValue; // and it shows "NewValue"

var message = new StringBuilder();

 foreach (var entityValidationError in exception.EntityValidationErrors)
 {
   foreach (var validationError in entityValidationError.ValidationErrors)
   {
     object value = null;
     try { value = entityValidationError.Entry.CurrentValues.GetValue<object>(validationError.PropertyName); }
     catch (System.Exception exception) { value = null; }

     message.AppendLine(validationError.PropertyName + ": " + validationError.ErrorMessage + " (VALUE: " + (value ?? "-") + ")");
  }
}

return message.ToString();
// and i get "AValue: The AValue field is required. (VALUE: -) so that value item is null

我在这一点上非常难过,只是无法弄清楚为什么它在尝试期间看起来很好但仍然会抛出验证错误消息。还有什么我可以添加,看看有没有其他东西在那里?或任何其他推荐的故障排除步骤?

3 个答案:

答案 0 :(得分:2)

请验证是否在Entity Framework数据集定义中正确设置了Item.AValue,以使其指向相关数据库表中的AValue列。如果由于某种原因缺少这个,那么在代码中设置它不会导致它在Db中更新,这可能会导致此错误。

答案 1 :(得分:1)

您的代码包含一些小的语法错误:

var item = (from i in entities.Item
           where i.Id = 1
           select i).First();

应为(double == sign)

var item = (from i in entities.Item
           where i.Id == 1
           select i).First(); 

另外:

item.AValue = "NewValue"

后面应该跟一个“;”登录。

我重新创建了一个有效的小例子:

对象类:

public class Item
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

实体框架上下文类:

public class Context : DbContext
{
    public DbSet<Item> items { get; set; }

    public Context()
        : base("Demo")
    {
    }
}

首次运行时,在数据库中添加一个项目:

using (var ctx = new Context())
{
    Item stud = new Item() { Name = "Name" };
    ctx.items.Add(stud);
    ctx.SaveChanges();
}

现在,使用以下代码替换上面的代码:

try
{
    var entities = new Context();
    var item = (from i in entities.items
                where i.Id == 1
                select i).First();
    item.Name = "NewValue";
    entities.SaveChanges();
}
catch (DbEntityValidationException exception)
{
}

答案 2 :(得分:0)

似乎问题是我的项目上有一个子对象也有一个AValue属性,这就是抛出异常的对象。

是否有某种方式(通过DbEntityValidationException)报告它是什么对象?