【问题标题】:breezejs and entity framework validation after updates, but before commit更新后但提交之前的微风js和实体框架验证
【发布时间】:2013-12-06 05:21:22
【问题描述】:

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

我正在寻找的是某种方式来应用完整的 sql 批更新,但在提交事务之前,我想进行验证以查看整个更改集是否有效。如果没有,那么我回滚。当然,验证必须在与更新相同的上下文/事务中完成,因此我可以访问更改。

我已经在 BeforeSaveEntities 中进行了验证,但这更多的是安全检查,(此用户可以更新此记录吗)。那简单明了。

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

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

这甚至可能吗?我有哪些选择? 谢谢

【问题讨论】:

    标签: validation frameworks transactions entity breeze


    【解决方案1】:

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

    http://breeze.github.io/doc-net/persistencemanager-core.html

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

    我希望这是有道理的:)

    【讨论】:

    • 这太棒了。我不知道我是怎么错过的。迫不及待想试一试。再次感谢您的所有回复。我一直在翻阅您的回复,以及 Ward 对所有微风相关的回复,并且学到了很多东西,尽管我觉得我只是用这个产品触及了冰山一角。这真的是一个很棒的图书馆。
    • 请将此帖子标记为已回答,以便其他人知道查看...和thx :)
    • 完成。为清楚起见,已重写引用的页面,现在清楚地表明这些功能实际上是基本 ContextProvider 类的一部分。
    • Jay 或 Ward,您能在接受的答案中更新上面的链接吗?它返回 404。谢谢。
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2014-04-26
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多