2011-04-19 82 views
7

我使用实体框架是第一次,我需要插入新对象到数据库之前添加业务逻辑,这里是我想过的选项:最佳实践,以实现业务逻辑的验证 - 实体框架

通过在实现验证层的自定义类使用OnPropertyChanging局部方法
  • 裹所生成的代码重写SaveChanges方法
  • 实现业务逻辑为每个实体 -
    1. 实现对DataContext的级别的业务逻辑。

    对实体框架管理业务逻辑时

  • +0

    什么版本的EF您使用的是? – 2011-04-19 13:58:30

    +0

    实体框架版本4.1 – Mark 2011-04-19 14:00:32

    +0

    好。您可以轻松创建POCO,我使用的链接是一个很好的起点。这是最接近选项3. – 2011-04-19 14:09:44

    回答

    7

    看看validation with EF - 验证是在实体内部进行的。

    这是一个非常干净的方式来组织您的项目。

    当您有POCO s时,实体验证的明显位置在POCO本身中。

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

    +0

    链接已经死机 – 2016-10-29 07:03:13

    +0

    @ B413 - 谢谢,我已经更新了答案。 – 2016-10-31 18:16:28

    0

    另一种方式要考虑的是完全组件化你的数据访问层完全来自业务逻辑层。

    创建一个只能直接访问实体框架的数据访问接口,然后在一个单独的项目中,我将创建您的业务逻辑类,它通过接口与数据访问层进行交互。您的业​​务逻辑项目中没有实体框架参考。

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

    +0

    这听起来我真的很期待,请你添加更多关于如何绑定这两个组件的解释(实体 - 业务逻辑) – Mark 2011-04-19 13:59:09

    +0

    我的空间不足以前的评论,但是我的业务逻辑层类将以相同的方式并在他们自己的名称空间中构建。典型地,我把自定义操作,验证以及其他一切都放在这里。您的业​​务逻辑类可以使用必要的数据访问接口。你可以更进一步,将你的图层分离成独立的项目和组件,但这可能会过度。 BL类接口的好处是可以直接通过Web服务或直接通过WPF访问它们。它灵活且组件化。 – 2011-04-19 14:23:35

    +0

    非常感谢您 – Mark 2011-04-19 17:32:51

    5

    我的经验:

    1. 这工作,但它是相当不少,其中必须验证这可以慢许多实体的情况下工作,。其实EFv4.1会自动完成此操作。
    2. 我不喜欢这种方式 - 它只服务于单个属性更改,不适用于需要在获取有效状态之前修改多个属性的复杂验证。
    3. 也许 - 我喜欢根据需求进行验证。每个实体都可以暴露Validate方法来检查整个实体的状态是否正确。

    但是,只有您总是使用整个实体,所有这些才有效。一旦开始使用部分更新和其他功能,您仍然需要在别处处理验证。这是另一个用于验证需求的+1。

    +0

    我同意,您使用哪种替代方案来解决您的问题? – 2016-01-21 17:46:08

    1

    我更喜欢数字3的一个版本。我喜欢抽象实体框架using a repository或类似的东西,以防我将来/需要替换EF。然后对于验证/业务逻辑,我使用任何验证技术对应用程序有意义,但通常是DataAnnotations(用于UI最小验证)和验证框架(如Fluent Validation)的最大验证/业务规则的组合。这个验证/业务逻辑同时存在于实体类(DataAnnotations)和抽象层中,这通常是我的应用程序中的一个服务层。

    0

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

    我们一直在使用EF 4.0 STE(Self Tracking Entities)一段时间,并且我们用自己的部分定义扩展了大部分。我们改变了一些创建STE的T4模板,以允许访问自定义部分类定义上的构造函数以及其他小改进。