我想保存个人编辑到数据库,我在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”属性。
这是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;
我不喜欢异常,我注册了OnSaveChanges并拥有此功能
var validationErrors = model.GetValidationErrors(); var h = validationErrors.SelectMany(x => x.ValidationErrors .Select(f => "Entity: " +(x.Entry.Entity) + " : " + f.PropertyName + "->" + f.ErrorMessage));
做为对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... } } }
我今天获得了这个错误而且RequireAttribute
,但我意识到这是在向个人模型添加一些RequireAttribute
以后,而且一些开发种子数据没有填充全部必需的字段。
因此请注意,若是您在经过某种初始化策略(如DropCreateDatabaseIfModelChanges
更新数据库时遇到此错误,则必须确保种子数据知足并知足任何模型数据验证属性 。
我知道这与问题中的问题略有不一样,但这是一个很受欢迎的问题,因此我想我会为其余与我本身有一样问题的人补充一点。
但愿这有助于其余人:)
为你的答案提供帮助,这对我颇有帮助。 由于我在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