2014-12-03 1 views
1

Я не могу найти это на своем сайте или здесь. Я надеюсь, что ответ будет ДА. В частности, я хочу написать Verifier для проверки уникальных нарушений ключа (я знаю, что мне нужно будет повысить уровень изоляции до Serializable). Это не будет работать, если верификатор работает в той же транзакции, что и «Сохранить».Использует ли DevForce ту же транзакцию для проверки и сохранения

ответ

1

DevForce не использует ту же транзакцию для проверки и сохранения обработки. В контексте EntityServerSaveInterceptor выполняются авторизация и валидация, и при выполнении фактического сохранения открывается TransactionScope. Если вы выполните запрос в верификаторе, он будет использовать отдельный TransactionScope.

Вы можете обойти это поведение с небольшой дополнительной работой в своем пользовательском EntityServerSaveInterceptor. Переопределите функцию ValidateSave для обхода проверки, затем переопределите метод ExecuteSave, чтобы открыть TransactionScope, а затем выполните свою логику проверки перед вызовом логики сохранения базы. TransactionScope, открытый DF во время сохранения, закроется в вашем 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

+0

Ваши верификаторы экземпляров будут вызываться автоматически базой. ValidateSave, поэтому вы можете просто вызвать base.ValidateSave в вашем TransactionScope. –

+0

Когда я пытаюсь это сделать, я получаю следующее исключение: транзакция, указанная для TransactionScope, имеет другое значение IsolationLevel, чем значение, запрашиваемое для области. Как установить диспетчера сущностей DefaultSaveOptions для ВСЕХ как на клиенте, так и на сервере. Я использую Коктейль, если это имеет значение. – jbiddle

Смежные вопросы