У меня есть веб-страница, которая принимает оплату, и она должна ВСТАВИТЬ 6 строк, распределенных по 4 таблицам. Мне пришлось разбить INSERTS на два отдельных SaveChanges, но мне нужно, чтобы они оба находились в одной и той же транзакции базы данных, чтобы все INSERTS и UPDATES откатывались в случае возникновения проблемы.
Я использую Breeze 1.6 поверх Entity Framework 6.2 поверх Oracle Mgd Data Access 12.2 в шаблоне SPA.
Четыре таблицы — это A, B, C и D. Таблицы B, C и D являются дочерними таблицами A, каждая из которых содержит PK A в качестве внешнего ключа. Первоначально я закодировал INSERTS в этой последовательности, как того требует мое приложение A1, B1, C1, C2, C3, D1, а затем один Breeze SaveChanges. C3 имеет триггеры Oracle, которые обновляют несколько столбцов в A1 и B1 во время INSERTED C3. Моя проблема в том, что Entity Framework НЕ ВСТАВЛЯЕТСЯ в последовательность, которую я закодировал (и я понимаю, что не могу контролировать последовательность). На самом деле я получал эту последовательность: A1, C1, C2, C3, B1, D1, и, поскольку у C3 есть триггер, который обновляет A и B, он столкнулся с проблемой, потому что B еще не был ВСТАВЛЕН.
Итак, я нашел этот вопрос: Какая логика определяет вставку порядок Entity Framework 6 и предлагает использовать несколько SaveChanges, чтобы получить некоторый контроль. Получил, что работает следующим образом:
- A1, B1 Сохранить изменения
- C1, C2, C3, D1 SaveChanges Все триггеры, включая обновление C3 для A и B, теперь работают отлично.
НО Breeze/Entity Framework рассматривает каждое SaveChanges как транзакцию, поэтому теперь я не могу откатить обе части в случае ошибок во втором SaveChanges. Придется ли мне самостоятельно кодировать откат части 1 в случае сбоя части 2? Или есть секрет, которого я не знаю?
Я знаком с BeginTransaction, Commit и Rollback, но не уверен, как/где их можно сочетать с Breeze и Entity Framework. Breeze захватывает каждое SaveChanges и автоматически включает его в транзакцию.
Мне нужно, чтобы несколько SaveChanges были сгруппированы в одну транзакцию.
Спасибо за любую помощь.