使用Entity Framework保存對SQL Server數據庫的更改時,一個或多個實體的驗證失敗

我想保存個人編輯到數據庫,我在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 ide

EventDate (Datatype = date)  
StartTime (Datatype = time)  
EndTime (Datatype = time)

Http表格 ui

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」屬性。 spa

描述:執行當前Web請求期間發生未處理的異常。 請查看堆棧跟蹤以獲取有關錯誤及其源自代碼的位置的更多信息。 code

異常詳細信息:System.Data.Entity.Validation.DbEntityValidationException:一個或多個實體的驗證失敗。 有關詳細信息,請參閱「EntityValidationErrors」屬性。 orm

來源錯誤: 對象

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」屬性。


#1樓

這是Tony擴展的擴展... :-)

對於Entity Framework 4.x,若是要獲取鍵字段的名稱和值,以便了解哪一個實體實例(DB記錄)存在問題,則能夠添加如下內容。 這樣能夠從DbContext對象訪問更強大的ObjectContext類成員。

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

#2樓

我不喜歡異常,我註冊了OnSaveChanges並擁有此功能

var validationErrors = model.GetValidationErrors();

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

#3樓

做爲對Praveen和Tony的改進,我使用了覆蓋:

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

#4樓

我今天獲得了這個錯誤而且RequireAttribute ,但我意識到這是在向個人模型添加一些RequireAttribute以後,而且一些開發種子數據沒有填充全部必需的字段。
因此請注意,若是您在經過某種初始化策略(如DropCreateDatabaseIfModelChanges更新數據庫時遇到此錯誤,則必須確保種子數據知足並知足任何模型數據驗證屬性

我知道這與問題中的問題略有不一樣,但這是一個很受歡迎的問題,因此我想我會爲其餘與我本身有一樣問題的人補充一點。
但願這有助於其餘人:)


#5樓

爲你的答案提供幫助,這對我頗有幫助。 由於我在Vb.Net中編碼,這是Vb.Net的Bolt代碼

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
相關文章
相關標籤/搜索