c# - преимущества - entity framework производительность




Ошибка проверки для одного или нескольких объектов при сохранении изменений в базе данных SQL Server с использованием Entity Framework (11)

Thnaks за ваши ответы, это очень помогает мне. как i-код в 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

Я хочу сохранить свое редактирование в базу данных, и я использую Entity FrameWork Code-First в ASP.NET MVC 3 / C #, но я получаю ошибки. В моем классе Event у меня есть типы данных DateTime и TimeSpan, но в моей базе данных у меня есть дата и время соответственно. Может ли это быть причиной? Как я могу применить к соответствующему типу данных в коде перед сохранением изменений в базе данных.

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».]


В качестве улучшения как для Правэна, так и для Тони я использую переопределение:

public partial class MyDatabaseEntities : DbContext
{
    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException dbEx)
        {
            foreach (var validationErrors in dbEx.EntityValidationErrors)
            {
                foreach (var validationError in validationErrors.ValidationErrors)
                {
                    Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                        validationErrors.Entry.Entity.GetType().FullName,
                        validationError.PropertyName,
                        validationError.ErrorMessage);
                }
            }

            throw;  // You can also choose to handle the exception here...
        }
    }
}

Вот расширение для расширения Тони ... :-)

Для Entity Framework 4.x, если вы хотите получить имя и значение поля ключа, чтобы вы знали, какой экземпляр объекта (запись в базе данных) имеет проблему, вы можете добавить следующее. Это обеспечивает доступ к более мощным членам класса ObjectContext из вашего объекта DbContext.

// Get the key field name & value.
// This assumes your DbContext object is "_context", and that it is a single part key.
var e = ((IObjectContextAdapter)_context).ObjectContext.ObjectStateManager.GetObjectStateEntry(validationErrors.Entry.Entity);
string key = e.EntityKey.EntityKeyValues[0].Key;
string val = e.EntityKey.EntityKeyValues[0].Value;

Вы можете извлечь всю информацию из DbEntityValidationException с помощью следующего кода (вам необходимо добавить пространства имен: System.Data.Entity.Validation и System.Diagnostics в ваш список using ):

catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", 
                                    validationError.PropertyName, 
                                    validationError.ErrorMessage);
        }
    }
}

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


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


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


Этот код помог найти мою проблему, когда у меня возникла проблема с моей Entity VAlidation Erros. Он рассказал мне точную проблему с моим определением сущности. Попробуйте использовать следующий код, в котором вам нужно будет хранить storeDB.SaveChanges (); в следующем try catch catch.

  try
{
         if (TryUpdateModel(theEvent))
         {
             storeDB.SaveChanges();
             return RedirectToAction("Index");
         }
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
    Exception raise = dbEx;
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            string message = string.Format("{0}:{1}", 
                validationErrors.Entry.Entity.ToString(),
                validationError.ErrorMessage);
            // raise a new exception nesting
            // the current instance as InnerException
            raise = new InvalidOperationException(message, raise);
        }
    }
    throw raise;
}

Я не люблю исключения, я зарегистрировал OnSaveChanges и получил это

var validationErrors = model.GetValidationErrors();

var h = validationErrors.SelectMany(x => x.ValidationErrors
                                          .Select(f => "Entity: " 
                                                      +(x.Entry.Entity) 
                                                      + " : " + f.PropertyName 
                                                      + "->" + f.ErrorMessage));

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


Не требуется изменение кода:

Пока вы находитесь в режиме отладки в блоке catch {...} откройте окно QuickWatch ( Ctrl + Alt + Q ) и вставьте туда:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

или же:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

Если вы не используете try / catch или не имеете доступа к объекту исключения.

Это позволит вам развернуться в дереве ValidationErrors . Это самый простой способ найти мгновенное понимание этих ошибок.





code-first