Ошибка проверки для одного или нескольких объектов при сохранении изменений в базе данных SQL Server с использованием Entity Framework - PullRequest
331 голосов
/ 23 марта 2011

Я хочу сохранить свою правку в базе данных и использую 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 для более подробной информации.]

Ответы [ 17 ]

2 голосов
/ 11 сентября 2014

Убедитесь, что если в строке БД есть nvarchar (50), вы не пытаетесь вставить в нее более 50 символов.Глупая ошибка, но мне потребовалось 3 часа, чтобы понять это.

2 голосов
/ 20 ноября 2013

Эта ошибка также возникает, когда вы пытаетесь сохранить объект с ошибками проверки. Хороший способ вызвать это - забыть проверить ModelState.IsValid перед сохранением в вашей БД.

1 голос
/ 05 февраля 2017

Я столкнулся с той же проблемой пару дней назад при обновлении базы данных.В моем случае было несколько новых необнуляемых столбцов, добавленных для обслуживания, которые не были включены в код, который вызывает исключение.Я вычислил эти поля и предоставил значения для них и их разрешение.

1 голос
/ 01 июня 2016

Это может быть связано с максимальным количеством символов, разрешенным для определенного столбца, как в sql, одно поле может иметь следующий тип данных nvarchar(5), но количество символов, введенных пользователем, больше указанного, поэтому ошибка возникает.

0 голосов
/ 20 февраля 2019

В моем случае у меня есть имя столбца таблицы Path, тип данных которого я установил как varchar (200). После обновления его до nvarchar (max) я удалил таблицу из edmx, а затем снова добавил таблицу, и она работала правильно для я.

0 голосов
/ 02 апреля 2013

Спасибо за ваши ответы, это мне очень помогает. как я кодирую в Vb.Net, этот код болта для Vb.Net

Try
   Return MyBase.SaveChanges()
Catch dbEx As Validation.DbEntityValidationException
   For Each [error] In From validationErrors In dbEx.EntityValidationErrors
                       From validationError In validationErrors.ValidationErrors
                       Select New With { .PropertyName = validationError.PropertyName,
                                         .ErrorMessage = validationError.ErrorMessage,
                                         .ClassFullName = validationErrors.Entry.Entity
                                                                    .GetType().FullName}

        Diagnostics.Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                           [error].ClassFullName,
                                           [error].PropertyName,
                                           [error].ErrorMessage)
   Next
   Throw
End Try
0 голосов
/ 13 апреля 2016

это может быть вызвано Свойством, которое не заполняется моделью .. вместо этого оно заполняется Контроллером .. что может вызвать эту ошибку .. Решением этой проблемы является назначение свойства перед применением проверки ModelState. и это второе предположение. возможно, у вас уже есть данные в вашей базе данных и пытается обновить его, но теперь загружает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...