Validation 更新后但提交前的breezejs和实体框架验证

Validation 更新后但提交前的breezejs和实体框架验证,validation,frameworks,transactions,entity,breeze,Validation,Frameworks,Transactions,Entity,Breeze,不确定这是一个轻松的问题还是EF问题。我有一个包含插入/删除/更新的SaveChanges映射。我有涉及多个实体及其关系的业务规则验证,因此在了解所有更改之前,我无法完成完整的验证。在客户端上执行相同的验证逻辑,但我正在服务器上重新验证 我所寻找的是应用完整sql批更新的某种方法,但在提交事务之前,我想进行验证,以查看整个更改集是否有效。如果没有,那我就后退。当然,验证必须在与更新相同的上下文/事务中完成,这样我才能访问更改 我已经在BeforeSaveEntities中进行了验证,但这更多的是

不确定这是一个轻松的问题还是EF问题。我有一个包含插入/删除/更新的SaveChanges映射。我有涉及多个实体及其关系的业务规则验证,因此在了解所有更改之前,我无法完成完整的验证。在客户端上执行相同的验证逻辑,但我正在服务器上重新验证

我所寻找的是应用完整sql批更新的某种方法,但在提交事务之前,我想进行验证,以查看整个更改集是否有效。如果没有,那我就后退。当然,验证必须在与更新相同的上下文/事务中完成,这样我才能访问更改

我已经在BeforeSaveEntities中进行了验证,但这更多的是一个安全检查(该用户是否可以更新此记录)。这是简单而直接的

包含客户记录和1个或多个地址记录和/或1个或多个联系人记录的变更集的示例业务规则:如果客户被分配到行业a,则其必须正好有1个编码为“主要”的地址,并且该地址必须至少有1个与之关联的联系人

试图通过评估现有状态和完整的更改集来进行验证似乎需要大量工作,而且容易出错。可以添加、删除或更新多个地址/联系人。在应用了所有更新之后,在提交之前,通过简单的SQL选择就可以很容易地完成

这可能吗?我有什么选择?
谢谢

好的,这确实需要更好地记录,但这应该是一个开始:

您可以将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.

}
[HttpPost]
public SaveResult SaveWithTransactionScope(JObject saveBundle){
var txSettings=newTransactionSettings(){TransactionType=TransactionType.TransactionScope};
ContextProvider.AfterSaveEntitiesDelegate=PerformPostSaveValidation;
返回ContextProvider.SaveChanges(saveBundle、txSettings);
}
private void PerformPostSaveValidation(字典保存映射、列表键映射){
//在这里做验证工作
//如果某些内容无法验证,则抛出异常。
}

我希望这是有意义的:)

好的,这确实需要更好地记录,但这应该是一个开始:

您可以将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.

}
[HttpPost]
public SaveResult SaveWithTransactionScope(JObject saveBundle){
var txSettings=newTransactionSettings(){TransactionType=TransactionType.TransactionScope};
ContextProvider.AfterSaveEntitiesDelegate=PerformPostSaveValidation;
返回ContextProvider.SaveChanges(saveBundle、txSettings);
}
private void PerformPostSaveValidation(字典保存映射、列表键映射){
//在这里做验证工作
//如果某些内容无法验证,则抛出异常。
}

我希望这是有意义的:)

好的,这确实需要更好地记录,但这应该是一个开始:

您可以将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.

}
[HttpPost]
public SaveResult SaveWithTransactionScope(JObject saveBundle){
var txSettings=newTransactionSettings(){TransactionType=TransactionType.TransactionScope};
ContextProvider.AfterSaveEntitiesDelegate=PerformPostSaveValidation;
返回ContextProvider.SaveChanges(saveBundle、txSettings);
}
private void PerformPostSaveValidation(字典保存映射、列表键映射){
//在这里做验证工作
//如果某些内容无法验证,则抛出异常。
}

我希望这是有意义的:)

好的,这确实需要更好地记录,但这应该是一个开始:

您可以将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.

}
[HttpPost]
public SaveResult SaveWithTransactionScope(JObject saveBundle){
var txSettings=newTransactionSettings(){TransactionType=TransactionType.TransactionScope};
ContextProvider.AfterSaveEntitiesDelegate=PerformPostSaveValidation;
返回上下文提供