2012-01-17 58 views

回答

35

No. Fluent API只是映射 - 正確的。數據註釋既是映射也是驗證 - 錯誤的。數據註釋首先是EF代碼最糟糕的特性之一,因爲使用這種方式時,他們將持久性與表示和驗證邏輯耦合在一起。

建議:不要使用EF實體進行演示。使用具有數據註釋的特殊視圖模型,並讓您的控制器從實體準備視圖模型,反之亦然。不久或稍後,您會發現您的驗證與您的映射不是1:1,或者您的視圖需要比實體類型中提供的數據更多或更少的數據。使用視圖模型,這些情況將由他們處理。

+0

爲什麼EF甚至需要映射如「HasMaxLength」?如果該值較長,SQL服務器會在嘗試寫入時拒絕它,並且讀取無關緊要,因爲'string'類型沒有長度限制。那麼這個映射實際上是什麼? – 2014-02-17 10:05:38

+0

我知道這是一個古老的問題,但認爲我會爲未來的讀者添加。一個原因是,如果您先使用代碼來創建數據庫,那麼流暢的api /數據註釋將用於構建create table語句,並且需要知道所需的長度等。 – Kate 2015-10-19 19:32:45

3

我今天掙扎了一段時間,這不是嚴格的客戶端驗證,因爲它需要往返,但它確實可以讓您受益於標準模板中的驗證摘要和消息幫助程序。在您的控制器的操作方法,你只需換你SaveChanges()呼叫嘗試 - 漁獲物和所產生的錯誤添加到ModelState如下:

try { 

    //This does not pick up fluent validation failures 
    if (ModelState.IsValid) { 
     db.Entity.Add(entity); 
     db.SaveChanges(); 
     //Users want to create loads of my entities without seeing the index... 
     return RedirectToAction("Create"); 
    } 

} catch (DbEntityValidationException e) { 

    //Log errors 
    foreach (var result in e.EntityValidationErrors) { 
     foreach(var error in result.ValidationErrors){ 
      ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
     } 
    } 

} 

//return to view with current model + validation errors 
return View(entity) 

這當然需要更多的工作,如果你在這裏保存多個實體。

使用視圖模型對象作爲拉吉斯拉夫建議是正確的做法。當然,可是,我卻用它來支持要求提前了下游的系統集成測試的測試UI ...