Entity Framework - добавление свойства навигации вручную

115

Я создал модель Entity Framework (4.0) из своей базы данных. Я не проектировал базу данных и не имею никакого контроля над схемой, но есть несколько таблиц, для которых не определены ограничения внешнего ключа, но определена неявная связь.

Например:

У меня есть таблица под названием Люди, в которой есть следующие столбцы: GenderID RaceID

Есть таблицы для пола и расы, но в таблице People нет внешнего ключа.

Когда я импортировал модель, она не добавляла свойства навигации для этих отношений. Я попытался добавить его вручную, но отключены параметры From Role и To Role. Я не знаю, как самому добавить отношения. Как мне это сделать?

Dismissile
источник

Ответы:

181

Ага - не все так просто.

Вот что вы делаете:

1 - Щелкните правой кнопкой мыши дизайнер, Добавить -> Ассоциация

2 - Установите ассоциацию и мощности (Люди * .. 1 Пол, Люди * .. 1 Раса)

3 - Зайдите в Браузер моделей -> Ассоциации

4 - Щелкните правой кнопкой мыши недавно созданные ассоциации, выберите Свойства.

5 - Здесь вам нужно настроить конечные точки для параметров ключа и каскада. Убедитесь, что вы правильно указали конечные точки. Вы также можете установить здесь реляционное ограничение для своего неявного навигационного свойства.

6 - Сопоставьте свойство навигации с соответствующими таблицами / полями.

7 - Подтвердите вашу модель, скрестите пальцы.

Надеюсь это поможет.

RPM1984
источник
20
+1 за спасение того, что осталось от моих волос. Я добавлю, что №6 требует изменения столбца внешнего ключа на странице свойств ассоциации, параметр Referential Constraint. Нажмите [...], чтобы открыть диалоговое окно ссылочного ограничения и изменить фиктивное поле, которое дизайнер подключил к дочерней таблице в разделе «Зависимое свойство».
Джоэл Браун
8
Вам также придется перейти к свойствам дочерней таблицы и удалить фиктивное поле, добавленное дизайнером (и которое не сопоставляется ни с какими реальными полями в дочерней таблице).
Джоэл Браун
2
В случае просмотра также убедитесь, что вы правильно поняли определение первичного ключа (щелкните правой кнопкой мыши, выберите связанные поля, отметьте их как EntityKey в свойствах). В противном случае вы можете получить: «Множественность недействительна в роли во взаимосвязи, потому что зависимая роль относится к ключевым свойствам ...»
Mikl X
1
На № 2 вы можете обязательно снять флажок «Добавить свойства внешнего ключа в объект». Это создает ненужные головные боли, если они вам действительно не нужны.
Шифрование
После того, как вы снова обновите свою модель из базы данных, скаффолд-объекты будут поддерживать добавленную вручную ассоциацию?
voodoo_patch
45

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

  1. Добавить ассоциацию через фон дизайнера контекстное меню правой кнопкой мыши
  2. Настройте свою ассоциацию (обязательно снимите флажок создания внешнего ключа)
  3. Щелкните правой кнопкой мыши ассоциацию и выберите Свойства.
  4. Нажмите ...кнопку для ссылочного ограничения
  5. Установите связь между клавишами внутри
  6. Проверить (из контекстного меню дизайнера)
  7. ???
  8. Прибыль!
dav_i
источник
4
+1 Пункт 4 заставил меня сделать это правильно, пропустив это с ответом RPM194.
Хьюго Логманс