asp.net-mvc - 如何准确知道哪个字段引发了 DbUpdateException

标签 asp.net-mvc entity-framework

我有以下 Action 方法,目前模型类有两个在数据库中设置为 Unique 的属性(名称和 IP)。因此,如果用户尝试添加/编辑一条记录,并且他提供了一个已经存在的 IP 或名称,则会引发以下异常 DbUpdateException。

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(ServerToEdit serverToEdit)
        {
            try
            {
               if (ModelState.IsValid)
           {
                repository.InsertOrUpdateServer(serverToEdit.Server,serverToEdit.TechnologyIP);
                repository.Save();
                return RedirectToAction("Index");
            }

               else
               {

                return View(serverToEdit);
           }
           }
           catch ()
           {
               ModelState.AddModelError(string.Empty, "Error occured. The Same IP/Name might already assinged.");

               return View(serverToEdit);


           }
           catch (DbEntityValidationException)
           {
               ModelState.AddModelError(string.Empty, "Error occured. User might not be defiend inside Active Directory.");

               return View(serverToEdit);
           }

            return null;

我正在显示 IP 或名称可能已经存在的一般消息,那么有没有办法确切地知道哪个字段引发了错误并向用户显示更具体的错误消息?

最佳答案

你可以创建这个扩展:

public static class DbUpdateExceptionExtension
{
    public static bool ViolateConstraint(this DbUpdateException e, string fieldName)
    {
        return e.InnerException.InnerException.Message.Contains(fieldName);
    }
}

然后如果你有这样的约束:

ALTER TABLE [Account]  ADD CONSTRAINT UniqueLogin  UNIQUE([Login])

你可以这样做:

try
{
    await databaseContext.SaveChangesAsync();
    return RedirectToAction("Index");
}
catch (DbUpdateException e)
{
    if (e.ViolateConstraint("UniqueLogin"))
        ModelState.AddModelError("Login", "Nom d'utilisateur ou mot de passe non valide.");
}

高频GL!

关于asp.net-mvc - 如何准确知道哪个字段引发了 DbUpdateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797802/

相关文章:

c# - LINQ 查询异常错误无效的列名称 'courseId1' EFCore

c# - 无法从用法推断类型参数

entity-framework - 代码优先 Entity Framework - 同一个表的多个外键

asp.net-mvc - asp.net mvc web api项目中的MessageHandlers vs Filters

asp.net-mvc - 使用自动映射器映射嵌套对象

c# - 将 DbSet<Entity> 转换为其 DbSet<IEntity> 而无需将所有实体拉入内存

NHibernate 等效于 Entity Framework DbSet.Local 用于未刷新的实体?

entity-framework - SQL Server Express 和 Entity Framework

javascript - 绑定(bind)后获取kendo scheduler数据源

c# - 如何让 ActionFilters 和 OutputCaching 一起工作?