C# 使用Fluent API对唯一约束进行服务器端验证
使用Fluent API作为OR/M,并实现了本节中提到的以下列的C# 使用Fluent API对唯一约束进行服务器端验证,c#,asp.net,asp.net-mvc,asp.net-mvc-5,ef-fluent-api,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Ef Fluent Api,使用Fluent API作为OR/M,并实现了本节中提到的以下列的唯一性 对于服务器端验证,以下代码可以正常工作: [HttpPost] public ActionResult Save(Company company) { try { if (company.Id == 0) _context.Companies.Add(company); else { var companyInD
唯一性
对于服务器端验证,以下代码可以正常工作:
[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");
}
您可以尝试以下方法:
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");
您的方法遇到了什么问题?我想将错误传递给
this.ModelState.AddModelError
,因此我将在视图中向用户显示输入的值在表中已经可用。是否将新数据插入数据库?如果是,每个新条目的id是什么?您的解决方案正在工作,但如何动态获取属性名?异常包含唯一约束的名称,所以如果e.ToString()包含IX_MyColumn,则表示属性名为MyColumn。所以,您应该创建映射集合(约束列),并检查它们在异常中是否存在。