快速背景: 我正在尝试编写一个编辑HttpPost Action。
public async Task<ActionResult> Edit (myViewModel model){
if(ModelState.IsValid){
myObject x = await db.myObjects.FindAsync(model.Id);
db.Entry(x).State = EntityState.Modified;
// code to map model to x
await db.SaveChangesAsync();
//...
SaveChangesAsync()行给出错误:&#34;一个或多个实体的验证失败。请参阅&#39; EntityValidationErrors&#39;物业详情。
现在奇怪的部分: 当我添加诸如
之类的行 Console.Write(x.property1);
Console.Write(x.property2.name);
等。对于x的所有属性,然后执行从模型到x的映射,然后保存更改,不会发生错误,并且代码的行为与我期望的一样。
请帮助,谢谢。
编辑:EntityValidationErrors表示需要x.prop1和x.prop2。我发现的另一个修复:编写x.prop1 = x.prop1;在db.SaveChangesAsync()之前; 感觉很奇怪,但它正在发挥作用。
编辑2:我的代码详细说明:
public class myObject{
public int Id {get; set;}
[Required]
public virtual y prop1 {get; set;}
[Required]
public virtual z prop2 {get; set;}
[Required]
public string prop3 {get; set;}
[Required]
public string prop4 {get; set;}
}
这是映射代码:
if(ModeState.IsValid){
myObject x = await db.myObjects.FindAsync(model.Id);
db.Entry(x).State = EntityState.Modified;
x.prop3 = model.editedValueForProp3;
db.myObjects.AddOrUpdate(x);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
注意事项:我只获得prop1和prop2的验证错误,它们是虚拟属性。如果我在db.SaveChangesAsync()
x.prop1 = x.prop1;
x.prop2 = x.prop2;
我正在使用延迟加载。这可能是问题吗?
答案 0 :(得分:0)
据我了解,问题是由于延迟加载。我已按如下方式更改了对数据库的调用:
myObject x = await db.myObjects
.Include(a => a.prop1)
.Include(a => a.prop2)
.FirstOrDefaultAsync(a => a.Id == model.Id);
这解决了我的问题。感谢所有帮助过的人。 :)