dotConnect Oracle: одно и то же имя ограничения внешнего ключа для нескольких ссылок на одну и ту же таблицу

Сначала у меня есть довольно сложная модель базы данных (около 100 объектов) в коде EF6. Одна из этих сущностей называется «Base», другая — «BaseAssociation». «BaseAssociation» устанавливает отношение «многие ко многим» между «базовыми» объектами. К объектам «BaseAssociation» прикреплены объекты «BaseAssociationAttribute», которые предоставляют метаданные для ассоциаций.

«BaseAssociation» содержит две ссылки на «базовую» таблицу: «AssociatedBy» и «AssociatedWith». При создании модели базы данных в базе данных Oracle с помощью Devart dotConnect (8.4.215) ограничения внешнего ключа для обеих ссылок имеют одно и то же имя. Обычно именование состоит из типа объекта и имени свойства. Но почему-то в моем случае это кажется сломанным. dotConnect выдает следующий sql:

ALTER TABLE "BaseAssociations"
  ADD CONSTRAINT "FK_Base_BaseAssociation" FOREIGN KEY ("AssociatedByRef") REFERENCES "Base" ("Id")
ALTER TABLE "BaseAssociations"
  ADD CONSTRAINT "FK_Base_BaseAssociation" FOREIGN KEY ("AssociatedWithRef") REFERENCES "Base" ("Id")

Каким-то образом оба внешних ключа получают одно и то же имя ограничения.

В то время как при настройке сервера sql все работает нормально. Почему-то мне не удалось воспроизвести это с более простой моделью, и все остальные имена ограничений следуют схеме по умолчанию. Я не касался ни одного из первых соглашений кода, но включил «усекать длинные имена по умолчанию», «игнорировать имя схемы» и «совместимость с соглашением о типе столбца».

Я использую EF6.1.1, dotconnect 8.4.215

У кого-нибудь есть идея? Спасибо


person hoekki    schedule 11.08.2014    source источник


Ответы (1)


Это невозможно сделать. Но в любом случае имена ограничений не так важны, вы можете добавить своего рода суффикс к каждому имени, например, FK_1, FK_2 ... FK_N. Если это так важно, вы должны создавать таблицы по разным схемам.

В официальной документации Oracle говорится:

В пространстве имен не может быть двух объектов с одинаковыми именами.

Следующие объекты схемы совместно используют одно пространство имен:

  • Столы
  • Взгляды
  • Последовательности
  • Частные синонимы
  • Автономные процедуры
  • Автономные сохраненные функции
  • Пакеты
  • Материализованные представления
  • Пользовательские типы

Каждый из следующих объектов схемы имеет собственное пространство имен:

  • Индексы
  • Ограничения
  • Кластеры
  • Триггеры базы данных
  • Ссылки на частную базу данных
  • Габаритные размеры

Поскольку таблицы и представления находятся в одном пространстве имен, таблица и представление в одной и той же схеме не могут иметь одинаковое имя. Однако таблицы и индексы находятся в разных пространствах имен. Следовательно, таблица и индекс в одной и той же схеме могут иметь одно и то же имя.

person Alessandro Rossi    schedule 11.08.2014
comment
Эй, Алессандро, спасибо за ваш ответ. Я знаю, что у меня не может быть нескольких ограничений с одним и тем же именем. Моя проблема в том, что dotConnect генерирует код sql, поэтому я не имею на это никакого влияния. Я просто не уверен, ПОЧЕМУ он генерирует этот явно ошибочный код только в этом конкретном случае, когда в противном случае он работает отлично. Мне интересно, является ли это ошибкой в ​​​​dotConnect и есть ли у кого-то еще такая же проблема. - person hoekki; 12.08.2014
comment
Я не готов к dotConnect. Я предполагаю, что если нет возможности изменить шаблон имен ограничений, это должно быть ошибкой модуля, который строит схему в Oracle. - person Alessandro Rossi; 13.08.2014