3

У меня есть следующие схемы в базе данных:Entity Framework: Условный внешний ключ

  • BillingReferences (ReferencingType TINYINT, ReferencingId TinyInt, ReferencedType TINYINT, ReferencedId TINYINT, IsActive бит) - где все поля (кроме IsActive) являются частью уникального индекса.
  • BillingType (BillingTypeId TINYINT, имя VARCHAR (50))

ReferencingType и ReferencedType является внешним ключом BillingTypes. BillingTypes содержит следующие строки:

BillingTypeId | Наименование

1 | Этикетки

2 | Страны

3 | PaymentProviders

4 | PaymentOptions

5 | Банки

ReferecingId и ReferencedId представляют Id одного из следующих лиц (в зависимости от ссылочной/REFERENCING Тип):

  • Банки (BankId TinyInt, имя VARCHAR (50))
  • Страны (CountryId TinyInt, имя VARCHAR (50))
  • Этикетки (LabelId TinyInt, Имя VARCHAR (50))
  • PaymentProviders (PaymentProviderId TINYINT, Имя VARCHAR (50))
  • PaymentOptions (PaymentOptionId TINYINT , Название varchar (50))

В будущем каждая сущность будет иметь несколько разных столбцов, но на данный момент это схема для простоты.

Между странами (за исключением стран) существует связь (1 - ). Этикетки имеют соединение (1-) с банками, PaymentProviders и PaymentOptions. И PaymentProviders есть соединение (1- *) к PaymentProviders

Так, например, если я хочу подключить банк с BankId 201 страны с CountryId 3003 у меня будет запись в BillingReferences, который будет выглядеть так : ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1

мы не сделали подключение/справочную таблицу для каждого типа подключения из-за рассмотрения расширяемость - Если мы хотим, чтобы добавить другой объект, который нам нужно сделать, это добавить его таблицу и добавить записи для нее в BillingReferences и BillingType.

Проблема заключается в том, что я не могу настроить условный внешний ключ между BillingReferences и каждого из субъектов, и я не могу настроить/отобразить его с EntityFramework либо ...

Я не смог найти любой учебник или пример, который использует этот тип реализации. Должен ли я создать справочную таблицу для каждого соединения, или есть способ настроить ее с помощью EntityFramework?

Спасибо за помощь :)

ответ

1

AFAIK, есть не способ сделать это.

Я бы хотел создать отдельную таблицу для каждого типа, если у вас действительно нет веских причин. Рассмотрение, которое вы упомянули, не является хорошим, ИМХО.

Имея больше таблиц, разрешает вам устанавливать ограничения на внешние ключи на ваших клавишах, и это хорошо переводится в EF. Это также помогает производительности: ваша большая справочная таблица с миллиметрами строк потребует больше времени для запроса, чем более маленькие таблицы (если вы ВСЕГДА не хотите, чтобы все ссылки на тип).

+0

«если вы ВСЕГДА не хотите, чтобы все ссылки на тип» - более или менее ... Мне всегда нужно показывать, допустим, все страны, связанные с конкретным Банком, или все банки, связанные с определенной меткой. Пользователь должен уметь связывать/деассоциировать любой объект, который он хочет, с выбранным объектом. – Captain

1

Нельзя не только сделать это в Entity Framework, но и в SQL не существует. У вас не может быть внешнего ключа, который ссылается на одну из пяти разных таблиц.

То, что я думаю, вам следует сделать, это иметь родительский, абстрактный ссылочный тип и сделать конкретные типы подтипов этого родительского типа. Теперь у вас есть только один внешний ключ, к одному столу. Вы можете выбрать таблицу для каждого типа или таблицы для сопоставления иерархии. Учитывая, что у вас нет каких-либо специальных столбцов вообще ни в одном из перечисленных вами типов, я думаю, что table per hierarchy mapping будет лучшим выбором для вас.

+0

Вы можете сказать, что каждый объект имеет свои собственные специальные столбцы Я просто описал упрощенную версию ... Так что я не вижу, как будет отображаться картография таблицы для иерархии ... – Captain

+0

Делайте таблицу по типу, если это лучше для части, которые вы не видите в своем вопросе. Дело в том, что использование супертипа позволяет использовать реальный внешний ключ в БД, в результате чего EF даст вам нужное вам сопоставление. –

0

Ну, я думаю, я собираюсь предложить пользователю Inferis и создать отдельную таблицу для каждого типа.

Спасибо ребята за ваши ответы - они помогли МНОГО :)

1

Единственный способ вы могли бы сделать то, что вы хотите, чтобы построить триггер, чтобы справиться с обработкой на стороне сервера. Вы не можете сопоставить FK так, как это делается с несколькими таблицами. Но триггер может справиться с этой логикой. Конечно, это было бы полностью вне EF ...

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

0

В SQL вы можете создать представление для каждого типа на основе одной таблицы. Каждый вид может выполнять объединения для извлечения информации, относящейся к этому типу. это также позволяет вам думать о ссылках в целом, игнорируя их тип.

 Смежные вопросы

  • Нет связанных вопросов^_^