#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) сообщить о том, что это за объект?