实体框架4.1代码首先在哪里验证

时间:2011-06-03 02:27:35

标签: entity-framework entity-framework-4.1 ef-code-first code-first

我是Entity Framework的新手,已经阅读了Julie Lerman的书以及很多关于它的文章。拥有已定义数据库和类的新项目,因此决定使用Code First方法(尽管它是新项目,因此数据库和类非常相似)。

所以,我们有: - 包含实体,映射和DbContext的数据库层 - 班级(业务层) - 带MVVM的WPF(UI层)

如果我理解Code First,数据库层引用业务层,UI引用数据库和业务层。 (如果我尝试在业务层中添加对数据库层的引用,则会出现循环引用错误。)

基本验证,比如我理解的必填字段或长度,但如果业务层不了解数据库层,可以在哪里进行额外的(更复杂的)验证?

谢谢, 克莱尔

3 个答案:

答案 0 :(得分:2)

数据库层不引用业务层,表示层不引用数据库层。这将破坏分层架构的全部含义。正确的分层是:

Database Layer -> Busienss Layer -> Presentation Layer

实体可能会让您感到困惑。在简单的架构中,实体在所有层之间共享。为此,您必须将它们放置在所有图层使用的单独装配中。

验证可以在任何层进行:

  • 表示层可以验证用户输入 - 它可以使用业务层中的方法
  • 业务层应该强制执行业务规则,它还可以公开UI进行用户输入验证的方法
  • 数据库层可以验证实体是否符合数据库中定义的约束(例如,填充了必需的列)

答案 1 :(得分:1)

您可以通过实施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了解此界面。所以它在保存更改之前调用此方法。如果有任何验证错误,它将中止trasnsaction。

答案 2 :(得分:0)

查看此博客以获取有关您的结构的更多信息。

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这样的第三方控件,那么他们会自动选择并显示您有验证问题。