Использование Entity Framework с Oracle и отображение наследования - таблица на тип.Идентификатор обновленного триггера не задан в таблице подклассов - PullRequest
0 голосов
/ 08 марта 2012

Я использую Oracle с Entity Framework. Идентификаторы базы данных генерируются с использованием триггеров и последовательностей.

Я хочу настроить наследование таблиц для каждого типа, как описано здесь . Я установил "CourseId" как StoreGeneratedPattern для "Identity".

Кажется, все в порядке, кроме случаев, когда я вставляю строку. Таблица, представляющая базовый класс (в приведенном выше пошаговом руководстве, таблица «Курс»), как и ожидалось, получает сгенерированный идентификатор.

Однако в таблице, представляющей унаследованный класс (в пошаговом руководстве, указанном выше, таблица OnlineCourse), вставлена ​​строка с нулевым значением CourseId. Это нарушает ограничение внешнего ключа.

Я предполагаю, что это как-то связано с последовательностью вставок. Я думаю, что это должно работать как:

  • Вставить строку курса
  • Получить вновь созданное значение CourseId
  • Вставить онлайн-курс, используя новый идентификатор курса

Однако это не работает, потому что он просто использует значение по умолчанию CourseId (ноль) для вставки в OnlineCourse.

Есть идеи как это исправить?

Ответы [ 2 ]

2 голосов
/ 25 мая 2012

Поскольку @Campinho не написал свое предложение в качестве ответа, я сделаю это.

Эта статья содержит некоторые сведения об ошибке в StoreGeneratedPattern в VS2010.

Одна из очень важных функций в инструментах ORM - это возможность автоматически получать данные, сгенерированные базой данных во время сохранения сущности, обратно в ваше приложение.Платформа Entity поддерживает эту функцию, устанавливая StoreGeneratedPattern в конфигурации постоянного свойства.Параметр StoreGeneratedPattern доступен в частях файла EDMX как SSDL (язык определения схемы хранилища), так и CSDL (язык определения концептуальной схемы).Конфигурация CSDL позволяет вам определять поведение при перезагрузке в подходе Модель-сначала, но часть SSDL отвечает за генерацию правильных команд SQL, которые сохранят сущность и перезагрузят автоматически сгенерированные свойства.К сожалению, долгое время это было источником всех проблем.

Функцией было очень сложно пользоваться из-за досадной ошибки в конструкторе Entity.Когда мы задали свойство в конструкторе, значение сохранялось только в части CSDL, но не в части SSDL файла EDMX, и эта функция не работала, пока мы не открыли файл EDMX как XML и не изменили часть SSDL вручную.Это решило проблему, но только до тех пор, пока мы не обновили нашу модель из базы данных.Обновление всегда удаляло всю часть SSDL, включая наше ручное изменение, поэтому нам пришлось сделать это снова.Любое постепенное развитие наших моделей становится большой болью.В качестве обходного пути использовались сопоставленные хранимые процедуры для вставки и обновления сущностей и сопоставления наборов результатов (возврата автоматически сгенерированных данных) из этих хранимых процедур обратно в сущность.Наконец, эта ошибка устранена в Visual Studio 2010 с пакетом обновления 1 (SP1), и мы можем без проблем использовать StoreGeneratedPattern, поскольку значение правильно задано как в CSDL, так и в SSDL-частях, и оно не перезаписывается при обновлении из базы данных.Если у вас возникла эта проблема, установите KB2561001 .

Я установил исправление и изменил StoreGeneratedPattern на «None», а затем на «Identity» для соответствующих идентификаторов.Я мог ясно видеть, что секция SSDL была обновлена, чтобы указать новую настройку.

Тогда все просто работало!Я не уверен, что будет в патче от Oracle, который, по их мнению, решит проблему.

1 голос
/ 11 апреля 2012

Я отправил запрос на обслуживание в Oracle, и оказалось, что это ошибка в их провайдере.

Ошибка 13724992 - EF: ENTITY НЕ ОБНОВЛЕНО ПОСЛЕ СОХРАНЕНИЯ С ИСПОЛЬЗОВАНИЕМ STOREGENERATEDPATTERN

Aисправление для этой ошибки будет выпущено в следующем наборе патчей.Однако, какой набор патчей будет включен и когда этот набор будет выпущен, в настоящее время неизвестно.Я сообщу вам, как только это исправление будет выпущено.

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