Модератор
|
||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||
Получение связанных данных (свойство навигации) в SQLite09.01.2020, 13:46. Показов 2780. Ответов 9
Первый опыт работы с SQLite и FW.
Создал базу из двух таблиц Во второй (Rooms) Вторичный ключ по ID первой (Dormitories)
Создал классы для контекстной Модели и саму Модель
Теперь пытаюсь получить данные из Базы. Получение общего списка Dormitories и Rooms - без проблем. А вот свойство-навигации RoomBD.Dormitory получается не всегда. Рабочий вариант
По алгоритму работы мне нужно будет иногда получать Комнаты, но не нужно Общежития. Но как я понял по экспериментам такое не возможно. Или я что-то упускаю? Надо добавить какие-то настройки, методы, атрибуты? Архив решения на всякий случай приложил.
0
|
09.01.2020, 13:46 | |
Ответы с готовыми решениями:
9
Редактирование связанных объектов через EF в SQLite, C#, EF 6.2, SQLite, C# Winforms Получение данных по id пользователя SQLite Получение данных из файла sqlite *.db в режиме он-лайн [EF] Указан недопустимый путь Include. Тип не объявляет свойство навигации |
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|||||||||||
10.01.2020, 07:22 | 2 | ||||||||||
Сообщение было отмечено Элд Хасп как решение
Решение
Это называется "внешний ключ".
Я не понимаю откуда люди берут такой пример. В большинстве случаев метод Load трогать не надо. DbSet<T> реализует набор методов для описания того что и как вы хотите достать.
Да всё возможно. Посмотрите документацию и примеры. Если что, то спрашивайте. Не делайте выводов на базе каких-то экспериментов)
1
|
Модератор
|
|||||||||||
10.01.2020, 12:06 [ТС] | 3 | ||||||||||
ОК. Только изучаю. Пока сбиваюсь с терминологии.
Откуда... Ну, как обычно из самых распространенных источников - Metanit, professorWeb и т.п. То есть правильное использование это так:
Пока делаю только первые шаги и не знаю что даже искать.... Чуток какое-то представление в голове появится дальше станет намного проще. Пару вопросов сразу. Таким образом мы получаем ВСЕ Room и Dormitory. А как быть если нужен только 1 из коллекции? Допустим, такой метод
Как правильно в этом случае быть?
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|||||||||||
10.01.2020, 12:17 | 4 | ||||||||||
Не совсем. Правильнее сначала материализовать ваш запрос (получить данные), а уже потом с ними работать.
В вашем примере загружается только одно общежитие. Просто из него отдельно вытаскиваются комнаты.
0
|
Модератор
|
||||||
10.01.2020, 12:41 [ТС] | 5 | |||||
То есть
Вариантов, конечно, может быть несколько. Но в данном случае ищу понимания взаимодействия EF с базой.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
10.01.2020, 13:52 | 6 |
0
|
Модератор
|
|||||||||||
10.01.2020, 14:16 [ТС] | 7 | ||||||||||
Вы имеете виду, что как этот вариант работает я правильно понял
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
10.01.2020, 14:22 | 8 |
Очень просто: первый вариант вытаскивает больше данных, чем вам реально нужно. Вы вытаскиваете сущность Dormitory со всеми её полями (не связанными данными, а собственными), но из неё берёте только коллекцию связанных комнат. Да ещё какой-то
Copy() добавили неуместный.Второй вариант сразу берёт только коллекцию комнат сущности Dormitory без её выгрузки. Намного более эффективная работа с данными.
0
|
Модератор
|
|||||||||||
10.01.2020, 14:43 [ТС] | 9 | ||||||||||
Это временный метод для преобразования из типов EF в неизменяемый тип DTO.
Потом метод будет изменён. Ок! А как быть при наличии связи "Многие ко многим"? На словах опишу. Если будет непонятно - добавлю код. Допустим, есть список инвентаря комнаты Inventories. В списке инвентаря Inventory {ID=1, Name = "Люстра", Rooms = {....}}. Мне надо получить все комнаты в которых есть этот инвентарь. Если делать
Надо делать так
И, по-моему, всё равно работать не будет, так как коллекции Inventories не загружены. И придётся их все загружать. Как правильно? Или в каждом случае надо делать по разному?
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
||||||
10.01.2020, 16:56 | 10 | |||||
Сообщение было отмечено Элд Хасп как решение
Решение
А они и не должны быть загружены. Методы-расширения интерфейса IQueryable (это те, которые идут после sdc.Rooms) принимают на вход Expression. EF анализирует эти Expression и на основе этого анализа строит SQL-запрос. В эти Expression можно передавать и IQueryable от других DbSet<T>. EF это поймёт и сможет построить весьма сложный SQL-запрос.
С многие-ко-многим EF 6 дружит очень хорошо. Может работать даже без введения промежуточной сущсности-связи.
1
|
10.01.2020, 16:56 | |
10.01.2020, 16:56 | |
Помогаю со студенческими работами здесь
10
Поиск в документе Word и получение информации из окна навигации Получение записей связанных с таблицей из другой таблицы Получение коллекции из бд sqlite Получение длинной строки из SQLite Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |