Entity Framework 6 - Отсутствует таблица с только первичными ключами, ссылающимися на разные таблицы
Мы изучаем Entity Framework 6.1 (от NuGet), когда мы уходим от Linq2Sql. У нас есть небольшая горстка таблиц, которые связывают две отдельные таблицы, как показано ниже.
База данных EF6 Первое поколение
Диаграмма DB:
![enter image description here]()
Обзор схемы:
![enter image description here]()
Когда в Visual студиях, пустой библиотеке классов, делая EDMX файл базы данных First EF6, диаграмма генерирует только таблицы TableA и TableC - TableB не генерируется.
![enter image description here]()
Visual Studios View:
![enter image description here]()
Вы можете видеть, что созданы только TableA и TableC. Технически TableB должен был быть создан, потому что вы хотели бы иметь возможность управлять этими ссылками.
Ассоциация между A и C, показанная на диаграмме:
![enter image description here]()
Я чувствую, что у меня отсутствует вариант или непонимание ключевой концепции Entity Framework. Любая идея, как иметь отсутствующий TableB, сгенерированный с помощью T4? Файл EDMX показывает это, но по какой-то причине он не генерируется в файл .CS с двумя свойствами, указывающими отношение.
Основная причина, по которой нам это нужно, - это расширить шаблон EF6 T4, чтобы добавить некоторые шаблоны factory в соответствие с существующими моделями. Поскольку он не генерирует класс для TableB, мы не получаем автоматически созданный код.
Мысли/предложения? Спасибо.
Ответы
Ответ 1
Слабые сущности или таблицы объединения не будут генерироваться EF, вам необходимо настроить отношения вручную через свободный API или использовать аннотации данных
Как указано на веб-сайте Microsoft: в соответствии с Соглашением о связи:
Примечание. Если у вас есть несколько отношений между одними и теми же типами (для Например, предположим, что вы определяете классы Person
и Book
, где Person
класс содержит навигацию ReviewedBooks
и AuthoredBooks
свойства и класс Book
содержит Author
и Reviewer
свойства навигации) вам необходимо вручную настроить отношениями с использованием аннотаций данных или свободного API. Для большего информация, см. аннотации данных - отношения и свободный API - Отношения.
Обратитесь к этой ссылке для получения дополнительной информации
ОБНОВЛЕНО
Обходной путь будет работать в случае EDMX (но это требует затрат) следующим образом:
- Удалить внешние ключи из таблицы соединений в базе данных
- Обновите EDMX из базы данных
- Восстановить внешние ключи в таблице соединений
это обходное решение будет работать до тех пор, пока вы не обновите свою модель из базы данных еще раз.
Рекомендуемое решение, сохранить все, как оно было создано EDMX, и узнать больше о том, как использовать операцию crud для этого случая, используя следующие ссылки, которые были "полезны" пользователем "@TravisWhidden"
Ответ 2
Как уже упоминалось @Hadi Hassan, EF не будет "раскрывать" или распознавать реляционные таблицы, которые состоят исключительно из других сущностей.
Работа вокруг:
Если вам нужно только "ПРОЧИТАТЬ данные, которые вы можете
- Определите
view
в вашей схеме для TableB
.
- Затем выполните
Model (.EDMX)
Обновление из БД (выберите "Обновить представления" )
- Теперь вы сможете запросить данные
TableB
, используя свой контекст EF.
Если вам нужно изменить записи (Создать, обновить, уничтожить) в TableB
-
Создание хранимых процедур в вашей схеме, соответственно.
-
Импортируйте свои Procs как функцию в вашу модель EF.
-
Теперь вы можете вызывать эти функции из вашего контекста модели для остальных ваших операций CRUD.