2016-09-06 32 views
0

我嘗試在MVC 5中創建,即使ModelState恢復有效,我也會收到驗證錯誤。MVC 5創建驗證錯誤但有效ModelState

錯誤消息

驗證失敗的一個或多個實體。有關更多詳細信息,請參閱「EntityValidationErrors」屬性。

,當我看的消息,它顯示了....

「E」當我看到POST不會在目前情況下

存在名稱數據,創建的模型中填寫了所有必填字段。我注意到模型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

你的'Wo'類是什麼樣的?帶有該錯誤消息的 – KSib

+2

..它如何工作?什麼是'e'?那應該是編譯時錯誤,而不是運行時錯誤?爲了更好地描述錯誤,爲什麼不嘗試'try-catch塊'並捕獲異常......然後當你調試它時,它會告訴你到底發生了什麼。 –

回答

1

包裝你到SaveChangesAsync中的呼叫try...catch像這樣:

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

確定它顯示'狀態'字段是必需的。我沒有包含該字段,因爲它將在SQL服務器數據庫中定義一個默認值。如果數據庫中存在默認值,爲什麼它要查找該字段? – 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類型的屬性可以爲空。這將解釋你爲什麼通過後驗證驗證,但實際上沒有保存實體。

通常,最好不要依賴數據庫首先設置默認值。相反,有屬性本身有一個默認值,然後它總是好的,不管發生了什麼事情在數據庫級別的:

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

的短,如果是真正的沒有需要的狀態,那麼你應該確保表格中的status列可以爲空。