实现业务逻辑验证的最佳实践 - 实体框架

时间:2011-04-19 13:48:07

标签: c# entity-framework entity

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

  1. 在DataContext级别实现业务逻辑 - 通过覆盖SaveChanges方法
  2. 使用OnPropertyChanging partial method
  3. 为每个实体实现业务逻辑
  4. 将生成的代码包装在实现验证层的自定义类中。
  5. 在Entity Framework上管理业务逻辑时,哪种方法是最佳实践

8 个答案:

答案 0 :(得分:7)

查看validation with EF - 验证在实体本身内。

这是组织项目的一种非常干净的方式。

当你有POCO时,实体验证的显而易见的地方就在POCO本身。

有意义的是,Customer对象的任何验证实际上都在Customer类中。

答案 1 :(得分:5)

我的经历:

  1. 这是有效的,但它是相当多的工作,并且在许多实体必须经过验证的情况下,这可能会更慢。实际上EFv4.1会自动执行此操作。
  2. 我不喜欢这种方式 - 它只提供单个属性更改,不适用于需要在获得有效状态之前修改多个属性的复杂验证。
  3. 也许 - 我喜欢验证需求。每个实体都可以公开Validate方法,该方法将检查整个权利的状态是否正确。
  4. 但只有当你总是使用整个实体时,这一切才有效。一旦开始使用部分更新和其他功能,您仍然需要在其他地方处理验证。这是另一个+1按需验证。

答案 2 :(得分:1)

我更喜欢3号版本。我喜欢抽象实体框架using a repository或类似的东西,以防我希望/将来需要替换EF。

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

答案 3 :(得分:0)

答案 4 :(得分:0)

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

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

通过这种方式,这些图层可以组件化,并且更容易作为多个程序集分发,以进行双层或三层访问。

答案 5 :(得分:0)

可能会尝试阅读Specification pattern

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)