我想保存我的编辑到数据库,我使用实体框架代码-在ASP。NET MVC 3 / c#,但我得到错误。在我的事件类中,我有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数据库

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'属性。

描述:在执行当前web请求期间发生了一个未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源位置的更多信息。

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

堆栈跟踪:

[DbEntityValidationException:一个或多个实体验证失败。]更多细节请参见'EntityValidationErrors'属性。]


当前回答

无需更改代码:

当您在catch{…打开“QuickWatch”窗口(Ctrl+Alt+Q)并粘贴在那里:

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

or:

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

如果您不在try/catch中,或者没有访问异常对象的权限。

这将允许您深入到ValidationErrors树。这是我发现的最简单的方法来立即洞察这些错误。

其他回答

我今天得到了这个错误,一时无法解决,但我意识到这是在向我的模型添加了一些RequireAttributes之后,一些开发种子数据没有填充所有必需的字段。 请注意,如果你在通过一些初始化策略(如DropCreateDatabaseIfModelChanges)更新数据库时得到这个错误,那么你必须确保你的种子数据满足并满足任何模型数据验证属性。

我知道这与问题中的问题略有不同,但这是一个很受欢迎的问题,所以我想我应该为和我有同样问题的人添加更多的答案。 希望这能帮助到其他人:)

几天前我在更新数据库时遇到了同样的问题。在我的例子中,为维护添加了一些新的非空列,这在导致异常的代码中没有提供。我计算出这些字段并为它们提供值,然后解析。

在我的情况下,我有一个表列名称路径,我设置的数据类型是varchar(200)。更新到nvarchar(max)后,我从edmx中删除了表,然后再次添加了表,它对我来说工作正常。

它可能是由模型未填充的属性引起的。取而代之的是由Controller..这可能会导致这个错误..解决方案是在应用ModelState验证之前分配属性。 第二个假设是。您的数据库中可能已经有数据 尝试更新它,但现在取回它。

无需更改代码:

当您在catch{…打开“QuickWatch”窗口(Ctrl+Alt+Q)并粘贴在那里:

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

or:

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

如果您不在try/catch中,或者没有访问异常对象的权限。

这将允许您深入到ValidationErrors树。这是我发现的最简单的方法来立即洞察这些错误。