【发布时间】:2012-10-01 17:23:03
【问题描述】:
一个典型的 EF+MVC 系统会有两个或三个级别的验证:
- 对于 ViewModel:输入/物理验证(DataAnnotations、FluentValidation),即长度、空值、范围、正则表达式等。
- 对于模型:输入/物理验证(如果不使用 MVC 并且数据来自另一个系统、WCF、表单等,则重复 1)
- 对于模型:逻辑/“业务规则”验证
对于实际模型/实体/域/“业务规则”,我找不到验证 2+3 的最佳实践。我们要么:
- 将简单的验证规则放在实体的属性设置器中(但这真的很乱)
- 挂钩到 EF 的
SaveChanges(),如果实体处于Added或Modified状态,则触发验证(一次验证整个实体)
这很难维护。 ViewModel 验证有很多想法,但对于模型验证,它是特定于领域的,因此需要您确定一个创造性的解决方案,而我的并不是那么好。
- 是否有更好的方法或有用的工具(例如 DataAnnotations 或 FluentValidation,但适用于域实体)?
- 在哪里进行模型验证或触发模型验证的最佳位置?
【问题讨论】:
-
我不明白你的“水平”。 “物理验证”是什么意思?我不明白 1 和 2 之间有什么区别。您指的是客户端和服务器端验证吗? MVC 中没有中间的“逻辑层”验证系统,事实上 MVC 并没有为此提供任何功能。但是在数据层有验证,它针对数据模型(不是逻辑模型)进行验证
-
我的问题与客户端/服务器无关。 1 表示验证输入:空/长度/范围/等。然后 2 是同样的事情,但是如果数据来自 WCF 或另一个系统,那么 1 没有发生,因此您将再次执行输入/物理验证以确保安全。忽略这一切,我真正需要了解的是人们如何为领域做 2+3。
-
您的前提是错误的,因此您基于该前提提出的问题是错误的。 MVC 不为模型提供任何验证。它只为视图模型提供验证。 EF 为数据模型提供验证。业务层或域模型在 EF 或 MVC 之外,完全由您控制如何进行验证。
-
我的前提没有错。我特别解释了这与 MVC 无关。我们在 MVC 系统以及非 MVC 系统中使用数据层。我需要知道如何以自动和优雅的方式验证数据层,就像对 MCV 的 ViewModels 所做的那样。
-
没有什么能阻止您在业务逻辑中使用 FluentValidation。
标签: asp.net-mvc entity-framework validation asp.net-mvc-4 entity-framework-5