不确定这是一个轻微的问题还是一个EF问题。我有一个包含插入/删除/更新的SaveChanges映射。我有业务规则验证涉及多个实体和它们之间的关系,所以在我知道所有更改之前,我无法进行完整的验证。在客户端上执行相同的验证逻辑,但我在服务器上重新验证。
我正在寻找的是应用完整的sql批次更新的某种方式,但在提交事务之前,我想进行验证以查看整个更改集是否有效。如果没有,那我就回滚。当然,验证必须在与更新相同的上下文/事务中完成,因此我可以访问更改。
我已经在BeforeSaveEntities中进行了验证,但更多的是安全检查,(此用户可以更新此记录)。这简单明了。
包含客户记录和一个或多个地址记录的变更集的示例业务规则,和/或一个或多个联系人记录:如果客户被分配到行业A,那么它必须具有1个地址,编码为“主要“和该地址必须至少有1个与之关联的联系人。
尝试通过评估现有状态和完整的更改集来进行验证似乎需要大量工作并且容易出错。可能会添加,删除或更新多个地址/联系人。在提交之前应用所有更新后,可以通过简单的SQL选择轻松完成。
这甚至可能吗?我有什么选择? 感谢
答案 0 :(得分:2)
好的,这确实需要更好地记录,但这应该提供一个开始:
http://www.breezejs.com/documentation/efcontextprovider-methods
您可以将Breeze.AfterSaveEntities方法与使用TransactionScope的TransactionType的TransactionSettings实例结合使用。
这可以确保整个保存发生在TransactionScope中(包括BeforeSaveEntities和AfterSaveEntities)。这意味着如果在AfterSaveEntities方法中抛出异常,它将中止事务,并回滚作为事务一部分的任何先前的插入,更新或删除。
[HttpPost]
public SaveResult SaveWithTransactionScope(JObject saveBundle) {
var txSettings = new TransactionSettings() { TransactionType = TransactionType.TransactionScope };
ContextProvider.AfterSaveEntitiesDelegate = PerformPostSaveValidation;
return ContextProvider.SaveChanges(saveBundle, txSettings);
}
private void PerformPostSaveValidation(Dictionary<Type, List<EntityInfo>> saveMap, List<KeyMapping> keyMappings ) {
// do your validation stuff here
// and throw an exception if something doesn't validate.
}
我希望这是有道理的:)