Entity Framework 数据库优先自动验证属性的最大长度

3
我正在使用EF Database First与现有的遗留数据库。几乎每个字段在数据库中都有maxlength值,我可以在.edmx文件中查看此值。 例如,一个字段CCSTATUS是nvarchar(20)。当用户输入超过20个字符时,它会清除ModelState.IsValid,但会在db.SaveChanges()上抛出DbEntityValidationException异常。 对于我已添加DataAnnotations的属性,当它们无法验证时,它们会添加模型错误,然后可以将其显示给用户以进行更正。我知道我可以将[MaxLength(n)]属性添加到Model MetaData类中的所有属性中,但是否有一种方法可以让EF在值大于属性的最大长度时添加模型错误,而不是抛出DbEntityValidationException异常? 编辑 感谢大家的答案。最终我使用了EF Power Tools反向工程代码优先功能从我的数据库生成了代码优先模型,其中包括适当的maxlength属性和其他必要的注释。

我不知道有什么简单的方法来做到这一点,但你可以查看这个链接,看看是否有帮助。 - undefined
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
这种行为的原因是EF和ASP.NET MVC是两个不同的东西。ModelState是MVC的一个概念,与EF edmx元数据无关。如果想要使用相同的类来表示操作输入和域实体,则应使用[MaxLength(n)]属性解决方案。但我建议使用视图模型/DTO。我不会选择@Reinard的解决方案(捕获DbEntityValidationException),原因如下:您正在验证输入,并在控制器操作内检查输入验证的结果。DbEntityValidationException表示完全不同层次(数据库)的问题。这种层次混合迟早会伤害您。另一个原因是不应像这样使用异常,但这是一个不同的话题,例如:为什么不将异常用作常规控制流程?

谢谢Peter,我已经修改了我的原始答案,以纳入你对此的想法。 - undefined

0
我相信你想要的是修改T4模板以自动添加数据注释。

0
为什么不捕获DbEntityValidationException并添加一个modelstate错误呢?这将设置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)]属性,并且可以在生成pocos时从数据库中获取这个属性,你可以修改你的T4模板来实现这一点。话虽如此,考虑到你正在与一个旧数据库集成,我假设模式更改可能发生在“新”应用程序(比如你正在开发的应用程序)的范围之外,这意味着这样的异常可能会变得更加常见,在这种情况下,我提供的上述代码示例可能会有用。至于每次模式更改都需要进行代码更改,还是事先进行适当的处理(在某种程度上),我认为这是一个完全不同的论点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,