Я хочу сохранить свою правку в базу данных и использую Entity FrameWork Code-First в ASP.NET MVC 3 / C #, но получаю ошибки. В моем классе Event у меня есть типы данных DateTime и TimeSpan, но в моей базе данных у меня соответственно Date и Time. Может ли это быть причиной? Как я могу привести к соответствующему типу данных в коде перед сохранением изменений в базе данных.
public class Event
{
public int EventId { get; set; }
public int CategoryId { get; set; }
public int PlaceId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime EventDate { get; set; }
public TimeSpan StartTime { get; set; }
public TimeSpan EndTime { get; set; }
public string Description { get; set; }
public string EventPlaceUrl { get; set; }
public Category Category { get; set; }
public Place Place { get; set; }
}
Метод в контроллере >>>> Проблема у storeDB.SaveChanges ();
// POST: /EventManager/Edit/386
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
var theEvent = storeDB.Events.Find(id);
if (TryUpdateModel(theEvent))
{
storeDB.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = storeDB.Categories.OrderBy(g => g.Name).ToList();
ViewBag.Places = storeDB.Places.OrderBy(a => a.Name).ToList();
return View(theEvent);
}
}
с участием
public class EventCalendarEntities : DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Place> Places { get; set; }
}
База данных SQL Server 2008 R2 / T-SQL
EventDate (Datatype = date)
StartTime (Datatype = time)
EndTime (Datatype = time)
Http Форма
EventDate (Datatype = DateTime) e.g. 4/8/2011 12:00:00 AM
StartTime (Datatype = Timespan/time not sure) e.g. 08:30:00
EndTime (Datatype = Timespan/time not sure) e.g. 09:00:00
Ошибка сервера в приложении '/'
Проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Data.Entity.Validation.DbEntityValidationException: проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.
Ошибка источника:
Line 75: if (TryUpdateModel(theEvent))
Line 76: {
Line 77: storeDB.SaveChanges();
Line 78: return RedirectToAction("Index");
Line 79: }
Исходный файл: C: \ sep \ MvcEventCalendar \ MvcEventCalendar \ Controllers \ EventManagerController.cs Строка: 77
Трассировки стека:
[DbEntityValidationException: проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации.]
источник
Ответы:
Вы можете извлечь всю информацию из
DbEntityValidationException
следующего кода (вам нужно добавить пространства имен:System.Data.Entity.Validation
иSystem.Diagnostics
в вашusing
список):источник
Required
). Я добавил ответ с немного большей информацией.Изменение кода не требуется:
Пока вы находитесь в режиме отладки внутри
catch {...}
блока, откройте окно «QuickWatch» ( Ctrl+ Alt+ Q) и вставьте туда:или:
Если вы не участвуете в программе try / catch или не имеете доступа к объекту исключения.
Это позволит вам углубиться в
ValidationErrors
дерево. Я нашел самый простой способ получить мгновенное представление об этих ошибках.источник
В случае, если у вас есть классы с одинаковыми именами свойств, вот небольшое расширение ответа Правина:
источник
В качестве улучшения как Правина, так и Тони я использую переопределение:
источник
Эта реализация переносит исключение объекта в исключение с подробным текстом. Он обрабатывает
DbEntityValidationException
,DbUpdateException
,datetime2
ошибки диапазона (MS SQL), и включают в себя ключе недействительного лица в сообщении (полезно , когда savind многих объектов в одномSaveChanges
вызове).Сначала переопределите
SaveChanges
в классе DbContext:ExceptionHelper класс:
источник
Этот код помог найти мою проблему, когда у меня возникла проблема с ошибкой Entity VAlidation. Он сказал мне точную проблему с моим определением сущности. Попробуйте следующий код, где вам нужно покрыть storeDB.SaveChanges (); в следующем попробуйте перехватить блок.
источник
Сегодня я получал эту ошибку и некоторое время не мог ее
RequireAttribute
исправить , но понял, что это произошло после добавления некоторых s в мои модели, и что некоторые начальные данные разработки не заполняют все обязательные поля.Так что просто обратите внимание, что если вы получаете эту ошибку при обновлении базы данных с помощью какой-то стратегии инициализации, как,
DropCreateDatabaseIfModelChanges
то вы должны убедиться, что ваши начальные данные соответствуют и удовлетворяют любым атрибутам проверки данных модели .Я знаю, что это немного отличается от проблемы в вопросе, но это популярный вопрос, поэтому я решил добавить немного больше к ответу для других, имеющих ту же проблему, что и я.
Надеюсь, что это помогает другим :)
источник
Я думаю, добавив попробовать / поймать для каждого
SaveChanges()
операции не является хорошей практикой, лучше централизовать это:Добавьте этот класс в основной
DbContext
класс:Это перезапишет ваш контекст
SaveChanges()
метод и вы получите разделенный запятыми список, содержащий все ошибки проверки сущности.это также может быть улучшено, чтобы регистрировать ошибки в рабочей среде, а не просто выдавать ошибку.
надеюсь, что это полезно.
источник
DbContext
вашем проекте.Вот расширение к расширению Тони ... :-)
Для Entity Framework 4.x, если вы хотите получить имя и значение ключевого поля, чтобы вы знали, с каким экземпляром объекта (записью БД) возникла проблема, вы можете добавить следующее. Это обеспечивает доступ к более мощным членам класса ObjectContext из вашего объекта DbContext.
источник
Я не люблю исключения, я зарегистрировал OnSaveChanges и имею это
источник
Эта ошибка также возникает, когда вы пытаетесь сохранить объект, имеющий ошибки проверки. Хороший способ вызвать это - забыть проверить ModelState.IsValid перед сохранением в вашей БД.
источник
Убедитесь, что если у вас есть nvarchar (50) в строке БД, вы не пытаетесь вставить в нее более 50 символов. Глупая ошибка, но мне понадобилось 3 часа, чтобы понять это.
источник
Это может быть связано с максимальным количеством символов, разрешенным для определенного столбца, как в sql, одно поле может иметь следующий тип данных,
nvarchar(5)
но количество символов, введенных пользователем, больше указанного, поэтому возникает ошибка.источник
Я столкнулся с той же проблемой пару дней назад при обновлении базы данных. В моем случае было немного новых необнуляемых столбцов, добавленных для обслуживания, которые не были включены в код, который вызывает исключение. Я выяснил эти поля и предоставил значения для них и их решения.
источник
Спасибо за ваши ответы, это очень помогает мне. как я кодирую в Vb.Net, этот код болта для Vb.Net
источник
это может быть вызвано свойством, которое не заполняется моделью .. вместо этого оно заполняется контроллером .. что может вызвать эту ошибку .. решение этой проблемы - назначить свойство перед применением проверки ModelState. и это второе предположение. возможно, у вас уже есть данные в вашей базе данных, и вы пытаетесь обновить их, но теперь извлекаете.
источник
В моем случае у меня есть имя столбца таблицы Path, тип данных которого я установил как varchar (200). После обновления до nvarchar (max) я удалил таблицу из edmx, а затем снова добавил таблицу, и она работала правильно для меня.
источник