在每个属性

时间:2017-04-21 08:02:13

标签: c# asp.net asp.net-mvc entity-framework

快速背景: 我正在尝试编写一个编辑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;

我正在使用延迟加载。这可能是问题吗?

1 个答案:

答案 0 :(得分:0)

据我了解,问题是由于延迟加载。我已按如下方式更改了对数据库的调用:

myObject x = await db.myObjects
.Include(a => a.prop1)
.Include(a => a.prop2)
.FirstOrDefaultAsync(a => a.Id == model.Id);

这解决了我的问题。感谢所有帮助过的人。 :)