Я убедился, что Visual Studio имел пакет обновления 1 после того, как увидел ошибку об изменениях в StoreGeneratedPattern = "Identity", которые не были скопированы. Все первичные ключи теперь правильно определены в модели.
Последовательности созданы. После изменения StoreGeneratedPattern мне пришлось изменить триггеры так, чтобы вставка сработала, когда первичный ключ был нулевым. Неважно, какое значение вы устанавливаете в коде первичным ключом. Если первичный ключ имеет шаблон Identity, EF не будет отправлять значения в базу данных.
Это работает, но это глупо, два коммита для одной связанной транзакции
if (ModelState.IsValid)
{
//add the parent entity
db.CASE_PHASE.Add(case_phase);
db.SaveChanges();
//add new child
var caseStage = new CASE_STAGE();
//...more variables initialized
//and add the foreign key to the child
caseStage.CASE_PHASE_ID = case_phase.ID;
db.CASE_STAGE.Add(caseStage);
db.SaveChanges();
return RedirectToAction........
}
Использование ADO DBContext и Oracle Entity Framework Beta (я не ожидаю другого поведения в производственном выпуске, который уже вышел, потому что идея триггера / последовательности, которую использует Oracle, похоже, плохо сочетается с EF.
В качестве альтернативы вы можете оставить для полей идентификатора значение по умолчанию для StoreGeneratedPattern, а затем получить первичный ключ непосредственно из базы данных, используя Database.SqlQuery. Добавьте его к родительскому элементу, а затем добавьте его как внешний ключ к дочернему элементу.
Вы можете сделать свой выбор: одна последовательность выбора из двойной и одна db.SaveChanges, которая по крайней мере придерживается идеи атомарной транзакции, или две db.SaveChanges.