EntityValidationErrors сообщает неправильно

#c# #.net #entity-framework

#c# #.net #entity-framework

Вопрос:

У меня есть случай, когда сущности.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
  

На данный момент я довольно озадачен, просто не могу понять, почему во время попытки все выглядит нормально, но все равно выдает сообщение об ошибке проверки. Есть ли что-нибудь еще, что я могу добавить, чтобы посмотреть, происходит ли там что-то еще? Или какие-либо другие рекомендуемые шаги по устранению неполадок?

Комментарии:

1. каков тип базы данных AValue?

2. Я бы удостоверился, что в списке объектов, которые вы извлекаете, ни у одного из них нет значения NULL для Avalue.

3. AValue — это строка (nvarchar(150) в базе данных)

4. когда я извлекаю данные из базы данных, они имеют существующее значение «USER1».

Ответ №1:

Пожалуйста, убедитесь, что Item.AValue правильно настроен в определении набора данных Entity Framework, чтобы он указывал на AValue столбец в соответствующей таблице базы данных. Если по какой-либо причине это отсутствует, то установка его в коде не приведет к его обновлению в БД, что может привести к этой ошибке.

Комментарии:

1. Это выглядит хорошо со стороны Entity Framework (это было первое создание модели в базе данных)… Я сохранил значения перед использованием аналогичного кода… Я уверен, что я сделал что-то немного не так, но не могу понять, что.

Ответ №2:

Ваш код содержит несколько небольших синтаксических ошибок:

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

должно быть (двойной знак ==)

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

Класс контекста Entity Framework:

 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)
{
}
  

Ответ №3:

Похоже, проблема заключалась в том, что в моем элементе был подобъект, который также имел свойство AValue, и это был тот, который вызывал исключение.

Есть ли какой-либо способ (через исключение DbEntityValidationException) сообщить о том, что это за объект?