2016-09-06 16 views
0

MVC 5内で作成しようとしていますが、ModelStateが有効になっていても検証エラーが発生しています。検証は、1つのまたは複数のエンティティのために失敗したMVC 5検証エラーを作成しますが、有効なModelState

エラーメッセージ

。詳細は、「EntityValidationErrors」プロパティを参照してください。

と私はメッセージを見たとき、それは私がPOSTを見てみると....

名「E」は現在のコンテキストで

存在しない示していデータの場合、作成されたモデルにはすべての必須フィールドが入力されています。モデルIDには0が割り当てられていました。私はそれがエラーかどうか、またはIDにゼロを渡すことになっているかどうかはわかりません。

何が問題なのですか?

WosController.cs

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "id,woNumber,woDescription,dueDate,qty,item_id,releaseDate,parentWO_id,wip_id")] Wo wo) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Wos.Add(wo); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(wo); 
    } 

Wo.cs

public partial class Wo 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Wo() 
    { 
     this.WoParts = new HashSet<WoPart>(); 
     this.WoStatuses = new HashSet<WoStatus>(); 
    } 

    public int id { get; set; } 
    public string woNumber { get; set; } 
    public string woDescription { get; set; } 
    public Nullable<System.DateTime> dueDate { get; set; } 
    public string qty { get; set; } 
    public Nullable<int> item_id { get; set; } 
    public Nullable<System.DateTime> releaseDate { get; set; } 
    public string status { get; set; } 
    public Nullable<int> parentWO_id { get; set; } 
    public int wip_id { get; set; } 
    public Nullable<int> part_id { get; set; } 

    public virtual Item Item { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<WoPart> WoParts { get; set; } 
    public virtual Wo woParentWO { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<WoStatus> WoStatuses { get; set; } 
    public virtual Part Part { get; set; } 
    public virtual Wip Wip { get; set; } 
} 
+1

*検証エラーが発生しました* ..何がエラーですか? –

+0

あなたの '臥'クラスはどのように見えますか?そのエラーメッセージで – KSib

+2

..どのように動作していますか? 'e'とは何ですか?それは実行時エラーではなくコンパイル時エラーでなければなりませんか?エラーのより良い説明を得るには、 'try-catch block'を試して例外をキャッチしてください。デバッグすると、何が起こったのかが正確に伝えられます。 –

答えて

1

そうのようなtry...catchSaveChangesAsyncにお電話をラップ:

try 
{ 
    await db.SaveChangesAsync(); 
} 
catch (DbEntityValidationException e) 
{ 
    var errorMessages = e.EntityValidationErrors 
     .SelectMany(x => x.ValidationErrors) 
     .Select(x => x.ErrorMessage); 
    var fullErrorMessage = string.Join("; ", errorMessages); 
    var exceptionMessage = string.Concat(e.Message, " The validation errors are: ", fullErrorMessage); 
    throw new DbEntityValidationException(exceptionMessage, e.EntityValidationErrors); 
} 

あなたの原因となる実際の性質を示すこと検証の問題。それでも助けが必要な場合は、質問を結果に更新してください。

+0

これは 'status'フィールドが必要であることを示しています。このフィールドには、SQLサーバーのDBに定義されている既定値が含まれているため、このフィールドは含めませんでした。なぜDBにデフォルトがある場合、そのフィールドを探しているのですか? – Beengie

+0

@Beengie今のところ、あなたのアプリケーションは、データベース内の 'status'を待っているデフォルト値があることを知らないが、バインドにそれを含める必要がある。あなたのバインディングの最後に 'status'を追加するだけです。' [Bind(Include = "id、woNumber、woDescription、dueDate、qty、item_id、releaseDate、parentWO_id、wip_id、status")] Wo wo) ' –

1

データベースがエンティティと同期していない可能性があります。エンティティでstatusプロパティは必須ではなく、デフォルトではタイプstringのプロパティはnullです。これはなぜポストで検証をパスしているのかを説明しますが、実際にエンティティを保存することには失敗します。

一般的に、最初にデフォルト値を設定するデータベースには依存しない方がいいです。代わりに、プロパティ自体はデフォルト値を持っていて、それは関係なく、常にデータベースレベルで何が起こっているの、罰金になります。そして、あなたがしなければならない、状態が真に必要とされない場合、その

private string _status; 
public string status 
{ 
    get { return _status ?? "Default Value"; } 
    set { _status = value; 
} 

ショートテーブルのstatus列がNULL可能であることを確認してください。

関連する問題