【问题标题】:Best practice to implement business logic validation - Entity Framework实现业务逻辑验证的最佳实践 - 实体框架
【发布时间】:2011-04-19 13:48:07
【问题描述】:

我是第一次使用Entity Framework,需要在将新对象插入数据库之前添加业务逻辑,以下是我想到的选项:

  1. 在 DataContext 级别实现业务逻辑 - 通过重写 SaveChanges 方法
  2. 使用 OnPropertyChanging 部分方法为每个实体实现业务逻辑
  3. 将生成的代码包装在实现验证层的自定义类中。

在实体框架上管理业务逻辑时哪种方法是最佳实践

【问题讨论】:

  • 你用的是什么版本的EF?
  • 好。然后,您可以轻松创建 POCO,我使用的链接是一个很好的起点。它最接近选项 3。
  • 感谢所有精彩的回复

标签: c# entity-framework entity


【解决方案1】:

看看validation with EF - 验证在实体内部。

这是组织项目的一种非常简洁的方式。

当您拥有POCOs 时,实体验证的明显位置就是 POCO 本身。

对 Customer 对象的任何验证实际上都在 Customer 类中是有道理的。

【讨论】:

    【解决方案2】:

    我的经验:

    1. 这可行,但工作量很大,如果有许多必须验证的实体,这可能会更慢。实际上 EFv4.1 会自动执行此操作。
    2. 我不喜欢这种方式 - 它只提供单个属性更改,不适用于需要修改多个属性才能获得有效状态的复杂验证。
    3. 也许——我喜欢按需验证。每个实体都可以公开Validate 方法,该方法将检查整个实体的状态是否正确。

    但这一切只有在你总是使用整个实体时才有效。一旦您开始使用部分更新和其他功能,您仍然需要在其他地方处理验证。这是按需验证的另一个 +1。

    【讨论】:

    • 我同意,您使用哪种方法来解决您的问题?
    【解决方案3】:

    我更喜欢数字 3 的版本。无论如何我都喜欢抽象实体框架 using a repository 或类似的东西,以防我将来想要/需要替换 EF。

    然后对于验证/业务逻辑,我使用对应用程序有意义的任何验证技术,但通常是DataAnnotations(用于 UI 最小验证)和像 Fluent Validation 这样的验证框架的某种组合,用于最大验证/业务规则。此验证/业务逻辑存在于实体类(DataAnnotations)和抽象层中,这通常是我的应用程序中的服务层。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        另一种考虑的方法是从业务逻辑层完全组件化数据访问层。

        创建一个仅直接访问实体框架的数据访问接口,然后在一个单独的项目中,我将创建您的业务逻辑类,该类通过该接口与数据访问层接口。您的业​​务逻辑项目中没有实体框架引用。

        通过这种方式,这些层是组件化的,并且更容易作为多个程序集分发,用于两层或三层访问。

        【讨论】:

        • 听起来我真正在寻找什么,您能否添加更多关于如何绑定两个组件的解释(实体 - 业务逻辑)
        • 我之前的评论空间不足,但我的业务逻辑层类将以相同的方式在它们自己的命名空间中构造。通常,我将自定义操作、验证和几乎所有其他内容都放在这里。您的业​​务逻辑类可以只使用必要的数据访问接口。您可以更进一步,将您的图层分成单独的项目和程序集,但这可能有点过火了。 BL 类接口的好处是可以直接通过 Web 服务或直接通过 WPF 访问它们。它灵活且组件化。
        【解决方案6】:

        也许可以尝试阅读Specification pattern

        【讨论】:

          【解决方案7】:

          您始终可以通过创建另一个部分类定义来扩展您的类,大多数 EF 模板将实体定义为部分定义,只是为了让人们轻松扩展它们。如果您正在使用 WPF 或 Silverlight,您将需要这样做,因为大多数东西都没有直接绑定,您要么有一个布尔值并希望将其转换为颜色等。编写转换器很慢并且需要更多代码来设置然后在您的 BusinessObjects 上创建新的 Getter。

          我们已经使用 EF 4.0 STE(自我跟踪实体)有一段时间了,我们用我们自己的部分定义来扩展它们中的大部分。我们更改了一些用于创建 STE 的 T4 模板,以允许访问自定义分部类定义上的构造函数以及其他一些小的改进。

          【讨论】:

            【解决方案8】:

            【讨论】:

              猜你喜欢
              • 2011-04-26
              • 1970-01-01
              • 2021-06-21
              • 2012-01-12
              • 1970-01-01
              • 1970-01-01
              • 2011-04-15
              • 1970-01-01
              • 2010-11-11
              相关资源
              最近更新 更多