我想保存我的编辑到数据库,我在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”属性。
描述:执行当前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行: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
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3190088