2017-04-21 7 views
0

クイック背景: 編集HttpPostアクションを作成しようとしています。各プロパティでConsole.Writeを使用した後にEntityValidationErrorsが消える

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は()行は、エラーを与える:「検証は、1つのまたは複数のエンティティのために失敗した詳細については、 『EntityValidationErrors』プロパティを参照してください今すぐ


奇妙な部分:。。 私が追加しますそのようなXのすべてのプロパティのための等

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

、次いでXにモデルからのマッピングを行うとSaveChangesメソッドなどの線、エラーが発生しないとコードbeha私が期待しているようにヴェス。

ご協力お願いいたします。


EDIT:EntityValidationErrorsは、x.prop1とx.prop2が必要であると言います。私が発見したもう一つの修正点:x.prop1 = x.prop1; before db.SaveChangesAsync(); 気分は変わっても機能しています。


EDIT 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); 

それは私の問題を解決しました。助けてくれたすべての人に感謝します。 :)

関連する問題