2010-01-16 110 views
9

对于一个干净的数据模型,我来回在这...实体框架最佳实践:什么层应调用SaveChanges()?

使用审批工作流程作为一个例子,让我们在我的web应用程序说我有一个页面,让用户标记一个MyEntityObject为批准。 MyEntityObject有一些属性可以控制其审批工作流程,所以我有一个常见的实用方法,名为FlagForApproval(MyEntityObject eo)

如若页面呼叫FlagForApproval()只设置必要的属性,然后调用的SaveChanges (),当它准备好了,还是应该FlagForApproval()保存更改?

使用实用方法保存更改看起来好像比要求做的要多一点(如果它只是一系列操作中的一步?),但同时使页面调用SaveChanges( )并将数据提交给数据库似乎可能被认为太接近数据层责任。

想法?

(更新:FWIW,到目前为止,我一直有实用方法调用的SaveChanges(),这样的页面只有一组异常处理,是否验证或数据。)

回答

2

我对这个电流意见问题是在验证数据后总是让业务逻辑层调用保存更改。当用户点击Save按钮时,我将需要验证的任何实体传递给BLL,并决定是否SaveChanges()。

我和你一样好奇,看看别人怎么说,因为这个问题(和其他许多问题)自从我开始使用EF以来一直困扰着我。

+0

我认为你是100%正确的 - 这是非常干净,以保持在调用SaveChanges BLL,让它决定是否执行保存或不。但我可以看到至少有两种情况,哪里可以发生异常: 1)该项目需要在模型方面进行验证 - 它不是BLL,而是必须确定是否应该保存更改。 2)SaveChanges是在真正简单的代码(添加实体,更新现有实体的单个属性)后执行的。在我的情况下,它将是DAL。 所以我想最好的解决方案是遵循你的直觉和/或经验。 – 2010-01-16 17:01:58

0

我不确定是否有正确或错误的答案,但是让FlagForApproval处理启动工作流的过程感觉更清晰(imo)。这包括告诉DataLayer保持对象的状态(即SaveChanges)。但是,这假设您有业务需求,说明一旦启动工作流程,状态应该被保留,因此如果发生什么事情(即服务器崩溃),工作流程过程从最后一步继续。

1

关键是分开数据库和服务语言。如果实用程序方法需要保存更改,那么它确实如果没有明确说明它不需要,并且需要执行其他步骤。该实用程序不应该具有名为SaveChanges的方法,它应该具有与过程相关的方法,如StartProcess或LoadToBatch。

将该实用程序视为更多服务并且不认为数据库。 “FlagForApproval”听起来像是一个数据库操作,试着将方法想象成类似“StartApprovalProcess”或其他过程相关的东西。 StartApprovalProcess将完成所有工作和提交。

如果有多个步骤,请使每个步骤间接指示可能会有更多步骤。只有最后一步提交。尽管最后一步可以做的是保存修改,使得像移动或启动过程一样被读取。

例:

  1. LoadToBatchApproval(MyEntityObject EO)

  2. ValidateApprovalBatch()...

  3. MoveBatchToProcessing()...