2017-03-09 46 views
0

將Fluent API用作OR/M,併爲SO post中提到的以下列取得UNIQUE使用Fluent API進行唯一約束的服務器端驗證

對於服務器端驗證下面的代碼工作正常:

[HttpPost] 
public ActionResult Save(Company company) 
{ 
    try 
    { 
     if (company.Id == 0) 
      _context.Companies.Add(company); 
     else 
     { 
      var companyInDb = _context.Companies.Single(c => c.Id == company.Id); 
      companyInDb.Name = company.Name; 
     } 
     _context.SaveChanges(); 
     return RedirectToAction("Index", "Companies"); 
    } 
    catch (System.Data.Entity.Validation.DbEntityValidationException ex) 
    { 
     var error = ex.EntityValidationErrors.First().ValidationErrors.First(); 
     this.ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
     return View("CompanyForm"); 
    } 
} 

如何驗證在服務器端的唯一值?

嘗試下面的代碼爲catch在所有

catch (System.Data.SqlClient.SqlException ex) 
{ 
    this.ModelState.AddModelError("Duplicate Value", ex.Message); 
    return View("CompanyForm"); 
} 
+0

你跟你的做法得到什麼問題? –

+0

我想將錯誤傳遞給'this.ModelState.AddModelError',所以我將在'view'中向用戶顯示輸入的值已經在表中可用。 –

+0

是新的數據插入到分貝?如果是,每個新條目的標識是什麼? –

回答

0
沒有反應

你可以試試這個:

using System.Data.Entity.Infrastructure; 
//.... 

catch (DbUpdateException e) when ((e?.InnerException?.InnerException as System.Data.SqlClient.SqlException)?.Number == 2601) 
{  
    this.ModelState.AddModelError("NameOfColumn", "Item with such NameOfColumn already exist"); 
} 
catch (System.Data.Entity.Validation.DbEntityValidationException ex) 
{ 
    var error = ex.EntityValidationErrors.First().ValidationErrors.First(); 
    this.ModelState.AddModelError(error.PropertyName, error.ErrorMessage); 
} 
return View("CompanyForm"); 
+0

您的解決方案正在工作,但如何動態獲取屬性名稱? –

+0

異常包含唯一約束的名稱,因此如果e.ToString()包含IX_MyColumn,則表示屬性名稱爲MyColumn。所以你應該創建映射集合(約束列)並檢查它們中的每一個是否存在異常。 –

相關問題