【问题标题】:Does DevForce use the same transaction for validation and the saveDevForce 是否使用相同的事务进行验证和保存
【发布时间】:2014-12-03 19:34:22
【问题描述】:

我似乎无法在他们的网站或此处找到此内容。我希望答案是肯定的。具体来说,我想编写一个验证程序来检查唯一键违规(我知道我必须将隔离级别提高到可序列化)。除非 Verifier 在与 Save 相同的事务中运行,否则这将不起作用。

【问题讨论】:

    标签: validation transactions devforce


    【解决方案1】:

    DevForce 不使用相同的事务进行验证和保存处理。在 EntityServerSaveInterceptor 的上下文中,执行授权和验证,然后在执行实际保存时打开 TransactionScope。如果您在验证程序中进行查询,它将使用单独的 TransactionScope。

    您可以通过在自定义 EntityServerSaveInterceptor 中做一些额外的工作来解决此问题。覆盖 ValidateSave 函数以绕过验证,然后覆盖 ExecuteSave 方法以打开 TransactionScope,然后在调用基本保存逻辑之前执行验证逻辑。 DF 在保存期间打开的 TransactionScope 将加入您的 TransactionScope。像这样的:

    public class EntityServerSaveManager : EntityServerSaveInterceptor {
    
      protected override bool ValidateSave() {
        // will do validation later
        return true;
      }
    
      protected override bool ExecuteSave() {
        using (var ts = new TransactionScope(TransactionScopeOption.Required, this.SaveOptions.TransactionSettings.ToTransactionOptions())) {
          // Do validation logic now
          ...
    
          // Now do save
          base.ExecuteSave();
          ts.Complete();
        }
      }
    }
    

    【讨论】:

    • 所以作为“立即执行验证逻辑”的一部分,在进行自定义验证后,我会调用 base.ValidateSave()?如果我编写一个 UniqueVerifier,“现在执行验证逻辑”是否只是对 base.ValidateSave() 的调用?
    • 您的实例验证器将由 base.ValidateSave 自动调用,因此您只需在 TransactionScope 中调用 base.ValidateSave。
    • 当我尝试这个时,我得到以下异常:为 TransactionScope 指定的事务具有与为范围请求的值不同的 IsolationLevel。如何为客户端和服务器上的所有实体管理器设置 DefaultSaveOptions。如果这很重要,我正在使用鸡尾酒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2016-09-09
    相关资源
    最近更新 更多