使用Entity Framework时在何处指定业务规则

时间:2010-07-14 17:32:15

标签: c# entity-framework c#-4.0

我在这里有点不知所措。

我在Project和Task之间有一对多的关系,在Task和TaskEvent之间有另一个关系。

任务仅存在于项目的上下文中,一旦分配给项目,就无法更改为属于另一个项目。

业务规则规定,只有在任务没有针对特定项目捕获的任务集合中,才能删除任务,从而从属于某个项目的任务集合中删除该任务。

如何在Entity Framework中指定此内容?我正在使用自我跟踪实体,但实际上我不知道在哪里定义这种规则。我们有其他规则是db无知的,但是如何定义业务规则,最好是在重新生成时与实体类隔离存在,作为一个单独的责任类?

我想我必须实现某种验证器,它可以使用反射来根据被验证对象的类型获取这些“规则”类,然后让它们各自执行验证。

但是如何将对象上下文推入其中呢?我的验证器是否应该具有对象上下文的实例,然后在执行时将其传递给每个规则?

更加慌乱,如何检测删除?我是否必须调用旧版本的项目并对其旧任务和当前任务进行比较,然后检查所有已删除的任务以确保它们没有捕获TimeEvent?

这种方法有什么缺点,你能提出什么建议?

编辑:我应该指定我们使用的是n层设计,并且客户端应用程序(MVC和Silverlight)都会使用WCF服务来执行任何有用的操作。这显然是我们想要实现验证的层,尽管我们可以在客户端上使用那些非特定于db的规则。我们目前正在使用DataAnnotations进行验证。

由于

2 个答案:

答案 0 :(得分:1)

查看this

由于您使用的是n层设计,我的建议是将EF用作ORM层,而不是完全替代域模型。您应该创建一个包含业务规则的单独BLL层,并将域模型映射到EF类。如果映射不复杂,可以手动完成,否则您可以使用Automapper等工具为您执行映射。

答案 1 :(得分:1)

我们最终使用的服务层根据规则上下文封装了规则和验证的实体。

对于每个操作,都有一个上下文和一组通过使用属性关联的规则。因此,所有相关规则都可以针对服务操作所需的特定类型的实体。

使用反射识别规则并在服务呼叫上进行测试。

实体框架实体仍然作为一个比我想要的更薄的域模型,但我们从未遇到过严重的问题,EF提供的跟踪实际上帮助使一些以前不可能的规则变得容易。