一位朋友问:“在将数据提交到数据库之前,您是否有关于如何检查服务器上的Breeze更改集数据并执行服务器端验证和安全检查的示例或文档?”我的答案如下。
答案 0 :(得分:2)
请参阅描述Breeze.NET工具的文档中的“Custom EFContextProvider”主题。
虽然本主题专门针对
EFContextProvider<T>
,但大多数要点适用于基类ContextProvider<T>
,这在保存到任何类型的数据存储时都很有用(请参阅{{ 3}}例如)。
BreezeMvcSpa模板生成的应用程序提供了保存验证的功能(从广义上理解为包括安全检查)。
BreezeMvcSpa模板将于2013年2月与“ASP.NET和Web Tools 2012.2”一起发布
查看继承自EFContextProvider<T>
的Models / TodoRepository.cs 。它会覆盖 BeforeSaveEntity(entityInfo)
,以确认您始终更新/删除属于当前用户的TodoList
/ TodoItem
。它还会将当前用户分配给新的TodoList
。在一个真实的应用程序中,这将是一个专门用于验证特定实体类型的辅助类的调度程序,我在下面稍作阐述。
还有另外两个重要的改写:
BeforeSaveEntities(saveMap)
让您有机会立即检查整个更改集。这是一种很好的方法,可以将整个变更集整体验证,以确保此保存请求作为单个事务有意义。它也是进行跨实体检查的好地方。在为每个实体单独调用BeforeSaveEntities(saveMap)
后调用BeforeSaveEntity(entityInfo)
。
BeforeSaveEntities(saveMap)
可能是将验证委托给专用帮助程序类的一个很好的调度点。我怀疑我是否会将所有验证逻辑放在一个大的ContextProvider
类中。我不介意所有保存活动通过ContextProvider.SaveChanges
门进行汇总,但我不想在ContextProvider
本身完成所有工作。
SaveChangesCore
是另一个重要的覆盖。这就是您进行任何最终预保存准备并将更改集交给实际执行数据库保存的内容(例如,DbContext.SaveChanges
方法)的地方。在将控制权返回给ContextProvider
之前,您可以拦截保存操作的结果。
另请注意,使用DbContext
时, EF会应用您在模型属性中规定的验证,包括标准集和自定义验证属性。
我有更多的保存建议,但这可能足以消化了。