asp.net-mvc - 域模型: how and where的验证

标签 asp.net-mvc entity-framework validation asp.net-mvc-4 entity-framework-5

典型的 EF+MVC 系统将具有两个或三个级别的验证:

  • 对于 ViewModel:输入/物理验证(DataAnnotations、FluentValidation),也就是长度、空值、范围、正则表达式等
  • 对于模型:输入/物理验证(如果不使用 MVC 并且数据来自另一个系统、WCF、表单等,则重复 1)
  • 对于模型:逻辑/“业务规则”验证

  • 对于实际模型/实体/域/“业务规则”,我找不到验证 2+3 的最佳实践。我们要么:
  • 在实体的属性 setter 中放置简单的验证规则(但这真的很困惑)
  • Hook 到 EF 的 SaveChanges() , 如果一个实体在 AddedModified state 然后触发验证(一次验证整个实体)

  • 这很难维护。 ViewModel 验证有很多想法,但对于模型验证,它是特定于域的,因此需要您确定一个创造性的解决方案,而我的并不是那么好。
  • 有没有更好的方法来做到这一点,或者有用的工具(比如 DataAnnotations 或 FluentValidation 但对于域实体)?
  • 进行模型验证或触发模型验证的最佳位置在哪里?
  • 最佳答案

    一个典型的 MVC+EF 系统将有 3 层,但它们不是您所说的。

  • 表示层(输入/输出)
  • 业务层(逻辑层)
  • 数据层(模型代表底层数据)

  • MVC 为第 1 层提供验证。EF 为第 3 层提供验证。MVC 或 EF 都没有为第 2 层提供验证功能。如果你想在那里进行验证,你必须自己做,或者使用第三方业务对象框架.

    第 1 层和第 3 层中的验证是分开的,尽管在许多情况下它们可能具有相似的验证。原因是验证以不同的方式和不同的要求完成。

    例如,由于数据建模或业务逻辑原因,您的数据库中可能有一个可以为空的字段(假设某些数据是预加载的,并且用户需要在业务流程中更新该字段)。数据层说它可以为空,但您希望您的 UI 使其成为必需的。

    编辑:

    简而言之,数据模型不应该强制执行业务规则。因此,除了针对物理数据模型进行验证外,您不需要在数据模型中进行任何验证(即,如果字段可以为空,则模型中的数据类型应该可以为空,否则不可以)。在大多数情况下,您实际上不能插入无效(从数据模型的角度来看)数据,因为代码模型不允许这样做。唯一的异常(exception)是字符串变量,它显然会溢出物理模型的大小限制,但如果发生这种情况,那么无论如何都会抛出异常。

    您的中间层,即业务层,应该是您需要验证业务规则的地方(例如,客户采购订单必须以字母开头)。 MVC 或 Entity Framework ,或 WCF 或其他任何东西都没有提供任何方法来进行此验证。

    这里有一点脱节,因为业务规则应该(理论上)驱动表示层验证。但是,MVC 没有内置功能可以做到这一点。因此,您最终会在 UI 中复制您的业务规则。

    至少有一个第三方业务对象框架试图处理这个问题。 CSLA。他们提供了一个自定义的 MVC 模型绑定(bind)器,将业务对象与 UI 联系起来以进行验证,但这只是使用 MVC 的内置可扩展性来执行此操作。

    因此,如果您不想使用专用的业务对象框架,您要么在 UI 和业务层之间重复验证,要么试图找出自己的方法来让您自己的业务层控制 UI 验证。

    关于asp.net-mvc - 域模型: how and where的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832897/

    相关文章:

    java - Jersey 重用子资源参数验证

    c# - 在 C# 中存储永远不会改变的静态数据的最佳方法是什么

    asp.net-mvc - 在 html helper 中获取属性的值

    asp.net-mvc - 有哪些值得编码以获得经验的 Web 应用程序?

    c# - LINQ to EF4 日期时间比较问题

    java - Spring MVC : Automatically return back to the same page upon binding errors

    asp.net-mvc - 如何防止 ASP.net WP 因错误而终止

    c# - 带有 EntityFramework 的通用存储库

    .net - EF Core 中的多对多关系

    javascript - 从 codeigniter 中的 View 调用 javascript 验证函数