2017-04-21 15 views
0

快速背景: 我正在嘗試編寫Edit HttpPost Action。EntityValidationErrors在每個屬性上使用Console.Write後消失

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()行給出了一個錯誤:「驗證失敗的一個或多個實體參見‘EntityValidationErrors’屬性更多細節


現在怪異的一部分:。 當我添加線,如

Console.Write(x.property1); 
Console.Write(x.property2.name); 

等對於x的所有屬性,然後執行映射從模型到X,然後調用SaveChanges,不會發生錯誤和碼BEHA正如我所期望的那樣。

請幫忙,謝謝。


編輯: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

什麼是'EntityValidationErrors'返回?在驗證錯誤消失之前放置了2個'Console.Write'行嗎? –

+0

看看這是有益的https://stackoverflow.com/questions/29231445/a-first-chance-exception-of-type-system-data-entity-validation-dbentityvalidati/29231832#29231832 –

+0

@TetsuyaYamamoto感謝您註釋。 EntityValidationErrors表示x的某些屬性是必需的。但是,當我Debug.WriteLine(x.prop1.Id)它顯示正確的值。爲什麼認爲x.prop1在保存更改時沒有值? Console.Write行放在代碼之前,將模型映射到x。 –

回答

0

據我所知,問題是由於延遲加載。我改變了對數據庫的呼叫,如下所示:

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

這已經解決了我的問題。感謝所有的幫助。 :)

相關問題