C# 使用Fluent API对唯一约束进行服务器端验证

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

使用Fluent API作为OR/M,并实现了本节中提到的以下列的
唯一性

对于服务器端验证,以下代码可以正常工作:

[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。所以,您应该创建映射集合(约束列),并检查它们在异常中是否存在。