Entity Framework: условный внешний ключ - PullRequest
3 голосов
/ 03 марта 2009

У меня есть следующая схема в базе данных:

  • 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 представляют собой идентификатор одного из следующих объектов (зависит от типа ссылки / ссылки):

  • Банки (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?

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

Ответы [ 5 ]

1 голос
/ 01 августа 2009

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

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

1 голос
/ 03 марта 2009

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

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

1 голос
/ 03 марта 2009

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

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

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

0 голосов
/ 19 июля 2017

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

0 голосов
/ 03 марта 2009

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

Спасибо, ребята, за ваши ответы - они помогли A LOT :)

...