2014-12-03 18 views
1

我似乎无法在他们的网站或这里找到它。我希望答案是肯定的。具体而言,我想写一个验证器来检查唯一的密钥违规(我知道我必须将隔离级别提高到Serializable)。除非验证程序在与Save相同的事务中运行,否则这将不起作用。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(); 
    } 
    } 
} 
+0

因此,作为'现在做验证逻辑'的一部分,在做我的自定义验证后,我会调用base.ValidateSave()?如果我写了一个UniqueVerifier,现在'做验证逻辑'是否只是调用base.ValidateSave()? – jbiddle 2014-12-05 20:41:02

+0

您的实例验证器将由base.ValidateSave自动调用,因此您可以在您的TransactionScope中调用base.ValidateSave。 – 2014-12-05 20:44:09

+0

当我尝试这样做时,出现以下异常:为TransactionScope指定的事务具有与为范围请求的值不同的IsolationLevel。如何为客户端和服务器上的所有实体管理器设置DefaultSaveOptions。如果有问题,我正在使用鸡尾酒。 – jbiddle 2014-12-09 19:05:36