структура сущности с оракулом, вставляющая родителя с ребенком - PullRequest
4 голосов
/ 03 февраля 2012

Мы используем EF 4.2 в приложении ASP.NET, связанном с базой данных Oracle 11 g с поставщиком Oracle EF. Родительская таблица называется CASE_PHASE и имеет первичный ключ с именем ID. Дочерняя таблица называется CASE_STAGE и имеет первичный ключ с именем ID. Первичные ключи для обоих вставлены с триггером перед вставкой. Этот вопрос подразумевает, что проблема может быть в триггере.

Этот код выглядит как примеры, которые я нахожу в книге Джулии Лерман, но только вставляет новый CASE_PHASE. Исключений нет, но ребенок не вставлен.

//from the controllers CREATE with hard coded values for testing purposes
        // POST: /CasePhase/Create

        [HttpPost]
        public ActionResult Create(CASE_PHASE case_phase)
        {


            var caseStage = new CASE_STAGE
                                {
                                    CREATED_BY_USER_ID = 1604,
                                    LAST_MODIFIED_BY_USER_ID = 1604,
                                    CURRENT = 1,
                                    STAGE_ID = 1752,
                                    DATE_CREATED = DateTime.Now,
                                    DATE_LAST_MODIFIED = DateTime.Now
                                };

            if (ModelState.IsValid)
            {
                //join new stage to phase
                caseStage.CASE_PHASE = case_phase;
                //attach linked entities to context
                //debugging shows case_phase has the values it needs   
                //but caseStage does not
                db.CASE_PHASE.Attach(case_phase);
                db.CASE_PHASE.Add(case_phase);
                db.SaveChanges();

Что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Я убедился, что 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.

0 голосов
/ 08 августа 2012

Откройте файл .edmx с помощью редактора XML и найдите раздел, который начинается со следующей строки:

<!-- SSDL content -->

Ниже должен быть тег EntityType и в нем есть определение таблицы базы данных,Кроме того, свойство для столбца идентификатора имеет StoreGeneratedPattern = "Identity".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...