【问题标题】:Entity Framework Database First Automatically Validate Max Length for Properties实体框架数据库首先自动验证属性的最大长度
【发布时间】:2013-07-29 15:02:40
【问题描述】:

我将 EF Database First 与现有的旧数据库一起使用。数据库中几乎每个字段都有一个 maxlength 值,我可以在 .edmx 文件中查看这个值。

例如,CCSTATUS 的一个字段是 nvarchar(20)。当用户输入超过 20 个字符时,它会清除 ModelState.IsValid,但会在 db.SaveChanges() 上抛出一个 DbEntityValidationException

对于我添加了 DataAnnotations 的属性,当它们无法验证时,它们会添加模型错误,然后可以将其显示给用户以便进行更正。我知道我可以将[MaxLength(n)] 属性添加到模型元数据类中的所有属性中,但是当值大于财产?

编辑

感谢大家的回答。我最终使用EF Power Tools Reverse Engineer Code First 功能从我的数据库中生成 Code First 模型,其中包括适当的 maxlength 属性和其他必要的注释。

【问题讨论】:

  • 我不知道有什么简单的方法可以做到这一点,但您可以查看link,看看是否有帮助

标签: c# asp.net-mvc entity-framework


【解决方案1】:

这种行为的原因是 EF 和 ASP.NET MVC 是两个不同的东西。 ModelState 是 MVC 的一个概念,它与 EF edmx 元数据无关。如果您想使用相同的类来表示操作输入和域实体,那么您应该使用[MaxLength(n)] 属性解决方案。但是,我建议改用 viewmodel/dto。

我不会采用@Reinard 的解决方案(捕获DbEntityValidationException),原因如下:您正在验证 input 并且您正在检查控制器内的输入验证结果行动。 DbEntityValidationException 表示完全不同的层(数据库)存在问题。这种层层混合迟早会伤害到你。另一个原因是您不应该使用这样的异常,但这是一个不同的主题,例如:Why not use exceptions as regular flow of control?

【讨论】:

  • 谢谢彼得,我已经修改了我原来的答案,以纳入您对此的想法
【解决方案2】:

我相信您想要的是修改 T4 模板以自动添加 DataAnnotation。

【讨论】:

    【解决方案3】:

    为什么不捕获 DbEntityValidationException 并添加一个模型状态错误?这会将 ModelState.IsValid 设置为 false。

        try
        {
          repo.Save(model);
        }
        catch (DbEntityValidationException ex)
        {
          ModelState.AddModelError("EntityError", ex);
        }
    

    您可以对此进行扩展并创建一个实用方法来记录导致错误的字段:

    foreach (var validationErrors in ex.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            string error = string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
    

    编辑:根据 Peter Porfy 的回答,我同意您应该避免使用异常作为常规控制流程的一部分。理想情况下,您想使用 [MaxLength(n)] 属性,并且可以修改您的 T4 template 以在生成 pocos 时从数据库中获取它。话虽如此,看到您正在与遗留数据库集成,我假设架构更改可能发生在“新”应用程序(如您正在开发的应用程序)范围之外,这意味着像这样的异常可能会变得更加常见,在在这种情况下,我提供的上述代码示例可能有用。无论您是否需要在每次架构更改时都进行代码更改,或者提前(在某种程度上)迎合这种情况,我相信这完全是一个不同的论点。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多