我是Entity Framework的新手,读过Julie Lerman的书和很多关于它的文章。有一个新项目已经定义了数据库和类,所以决定使用代码优先的方法(尽管这是新项目,所以数据库和类非常相似)。
因此,我们有:-具有实体、映射和DbContext的数据库层-类(业务层)-带有MVVM(UI层)的WPF
如果我正确理解代码优先,数据库层引用业务层,UI同时引用数据库和业务层。(如果我试图添加对数据库层的业务层引用,我会得到循环引用错误。)
基本验证,比如我理解的必填字段或长度,但如果业务层不知道数据库层,那么将额外的(更复杂的)验证放在哪里?
谢谢,Claire
数据库层不引用业务层,表示层不引用数据库层。这将打破分层体系结构的全部意义。正确的分层是:
Database Layer -> Busienss Layer -> Presentation Layer
可能让你困惑的是实体。在简单的体系结构中,实体在所有层之间共享。要实现这一点,必须将它们放置到所有图层使用的单独部件中。
验证可以在任何层进行:
- 表示层可以验证用户输入——它可以使用来自业务层的方法来验证
- 业务层应该强制执行业务规则,它还可以公开UI进行用户输入验证的方法
- 数据库层可以验证实体是否符合数据库中定义的约束(例如,是否填写了必填列)
您可以通过实现IValidatableObject接口在实体类中进行复杂的验证。然后你可以在内进行验证
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
//your validation logic. if there are no errors return an empty list
return new System.Collections.Generic.List<ValidationResult>();
}
EF 4.1了解该接口。因此,它在保存更改之前调用此方法。如果存在任何验证错误,它将中止交易。
看看这个博客,了解有关您的结构的更多信息。
http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx
这应该会有所帮助。
这个博客还有几个值得研究的部分,
http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx
http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx
通常,您可以选择在多个地方进行验证。你的视图模型就是一个地方。例如抛出ValidationException。如果你使用的是像telerik这样的第三方控件,它们会自动拾取并显示你有验证问题。