У меня есть приложение, в котором я использую Entity Framework или обрабатываю данные из таблиц базы данных. Существует основная таблица, CUSTOMER
которая связана с тремя другими таблицами через внешние ключи. Связанные таблицы
RENTAL
PAYMENTS
VEHICLES
Я могу добавлять/редактировать/удалять сущности во всех этих 4 таблицах с помощью EF.
Я бы хотел изменить текущий сценарий (где EF используется для обработки всей транзакции БД) примерно так.
После создания нового объекта и при попытке сохранить сущности (5 новых сущностей/записей) обратно в базу данных, я хотел бы использовать хранимую процедуру для добавления нового объекта в модель
VEHICLES
и использовать EF для сохранения объектов ко всем другим модели - и все равно все это под одной транзакцией.Кроме того, мне нужно подождать, пока вызов EF будет завершен, так как мне нужен новый
CUSTOMER_ID
созданный как часть сохранения EF, который будет передан в качестве входного параметра хранимой процедуры для сохранения объекта VEHICLES.
Я не хочу вызывать хранимую процедуру из-за пределов транзакции, поэтому, если вызов хранимой процедуры завершается с ошибкой, изменения, внесенные в базу данных через EF, также откатываются.
Кто-нибудь знает, как добиться этого?
PS: Не ищите образцы кода; иллюстрация высокого уровня поможет.
Я использую Entity Framework 5,.Net v4.5, VS 2013, Oracle 11g, ODP.Net
Карта хранит procs для Entity 1) Создайте хранимую процедуру 2) Обновите модель данных, чтобы включить хранимую процедуру - меню "Обновить модель из базы данных" через EF 6.x
3) Затем найдите Entity (или создайте новый Entity) в Модели данных сущностей и подключите Хранимые Procs для вставки, обновления и удаления функций - щелкните правой кнопкой мыши Entity и выберите меню "Сохраненная процедура отображения"
4) Используйте LinqToEntity для добавления/изменения объектов с помощью Database.BeginTransaction(), затем вызовите SaveChanges() в контекст, затем Commit или Rollback.
Примечание. Начиная с EF6 Database.ExecuteSqlCommand() по умолчанию будет завершена команда в транзакции, если ее еще нет. Есть перегрузки этого метода, которые позволяют вам переопределить это поведение, если хотите. Также в EF6 выполнение хранимых процедур, включенных в модель через API, таких как ObjectContext.ExecuteFunction() делает то же самое (за исключением того, что поведение по умолчанию в настоящий момент не может быть переопределено). В любом случае уровень изоляции транзакции - это любой уровень изоляции, который поставщик базы данных рассматривает по умолчанию. По умолчанию, например, на SQL Server это READ COMMITTED. https://msdn.microsoft.com/en-us/data/dn456843.aspx