Я не могу найти это на своем сайте или здесь. Я надеюсь, что ответ будет ДА. В частности, я хочу написать Verifier для проверки уникальных нарушений ключа (я знаю, что мне нужно будет повысить уровень изоляции до Serializable). Это не будет работать, если верификатор работает в той же транзакции, что и «Сохранить».Использует ли DevForce ту же транзакцию для проверки и сохранения
1
A
ответ
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();
}
}
}
Так как часть «Теперь ли логика проверки», после выполнения моей собственной проверки, я бы назвал base.ValidateSave()? Если я напишу UniqueVerifier, будет ли теперь логика проверки правильности быть только вызовом base.ValidateSave()? – jbiddle
Ваши верификаторы экземпляров будут вызываться автоматически базой. ValidateSave, поэтому вы можете просто вызвать base.ValidateSave в вашем TransactionScope. –
Когда я пытаюсь это сделать, я получаю следующее исключение: транзакция, указанная для TransactionScope, имеет другое значение IsolationLevel, чем значение, запрашиваемое для области. Как установить диспетчера сущностей DefaultSaveOptions для ВСЕХ как на клиенте, так и на сервере. Я использую Коктейль, если это имеет значение. – jbiddle