Возможно ли смоделировать «внешний ключ» в несколько таблиц с помощью Entity Framework? - PullRequest
1 голос
/ 13 января 2011

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

  1. Таблица продуктов. Столбцы:

    • Id (личность, ПК)
    • Группа (НЕ НУЛЬ)
    • Подгруппа (НЕ NULL)
    • Код (Уникальный, НЕ НУЛЬ)
    • Описание
  2. Договорная таблица. Столбцы:

    • Идентификатор (личность, ПК)
    • Код (НЕ НУЛЬ)
    • 1028 *! Описание *
  3. Таблица скидок. Столбцы:

    • Id (личность, ПК)
    • Тип (ограничено одним из четырех значений:
      • 'продукт',
      • 'группы',
      • «подгруппа» или
      • 'контракт') (НЕ NULL)
    • Объект (в зависимости от значения типа относится к одному из четырех:
      • Product.Code
      • Product.Group
      • Product.SubGroup
      • Contract.Code) (НЕ NULL)
    • Значение (НЕ NULL)

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

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

У меня такой вопрос: возможно ли определить классы и сопоставления с помощью Entity Framework, чтобы я мог использовать свойства навигации в этом сценарии? Например, я делаю Discount.Object и в ответ получаю либо объект Contract, либо объект Product, и, если это объект Product, он извлекается в правильном свойстве.

Возможно ли это, или что-то подобное, или соединения - лучшее, что я могу сделать?

Ответы [ 2 ]

1 голос
/ 13 января 2011

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

Если вы можете, вы можете создать представление для таблицы «Скидка», в котором для каждого отношения есть четыре различных столбца, допускающих значение NULL. Это будет хорошо отображаться в EF как четыре свойства навигации.

После того, как вы это сделаете, если вам все еще нужен комбинированный столбец, вы можете добавить свое собственное свойство к сущности Discount, которая будет возвращать object, проверив, какое из четырех свойств навигации не равно NULL, и вернув связанный объект. .

0 голосов
/ 13 января 2011

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

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