Хобрук: Ваш путь к мастерству в программировании

Entity Framework Core Use Include on QueryType (представление базы данных)

У меня есть EF Core, подключенный к MySql, и у меня есть представление, называемое:

PostViews

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

Это работает, если я просто вызываю _context.PostViews, но если я использую Include, например:

_context.PostViews.Include(xxxx), выдает мне эту ошибку:

System.InvalidOperationException: «Свойство «Комментарий» не является навигационным свойством типа сущности «PostWithViews». Метод «Включить (строка)» можно использовать только с «.». разделенный список имен свойств навигации.'

введите здесь описание изображения

PostView имеет все свойства сообщения (id, title, content, Comment и т. д.), а также имеет один дополнительный столбец с именем Views, который показывает, сколько людей прочитало это сообщение.


Вот мой пост:

public partial class Post
    {
        public Post()
        {
            Comment = new HashSet<Comment>();
        }

        public string Id { get; set; }
        public string ApartmentId { get; set; }
        public string AuthorId { get; set; }
        public string CategoryId { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime? DueDate { get; set; }
        public bool? Disabled { get; set; }
        public DateTime? CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
        public string UpdatedBy { get; set; }

        public virtual Apartment Apartment { get; set; }
        public virtual User Author { get; set; }
        public virtual PostCategory Category { get; set; }}
        public virtual ICollection<Comment> Comment { get; set; }
    }

Класс PostWithViews почти такой же, как у Post, но с еще одним свойством Views:

public int Views { get; set; }

Вот как я включаю свойства, например. Комментарий:

return GetAll()
       .Include(p => p.Author)
       .Include(p => p.Comment)

  • Сообщение об исключении сообщает вам о проблеме. Каков тип свойства Comment? 15.05.2019
  • привет @IvanStoev, пожалуйста, посмотри мое обновление. 15.05.2019
  • Привет, взгляните на Сравнить типы запросов с типами сущностей. Вы, вероятно, пропустили следующий пункт: Они могут содержать только ссылочные свойства навигации, указывающие на сущности.. Таким образом, нет возможности включить Comment, так как это свойство навигации коллекция. Но включение Apartment, Author и Category должно работать. 15.05.2019
  • привет @IvanStoev спасибо, что указали на этот момент. не могли бы вы сделать это ответом, я хотел бы отметить это как ответ. спасибо 15.05.2019

Ответы:


1

В настоящее время (EF Core 2.x) типы запросов не поддерживают свойства навигации по коллекциям, как указано в Сравните типы запросов с типами сущностей, раздел документации:

  • Они могут содержать только ссылочные свойства навигации, указывающие на сущности.

Таким образом, хотя ваше свойство Comment выглядит как свойство навигации коллекции, для EF Core это не так, поэтому его нельзя использовать в Include / ThenInclude (или запросе LINQ to Entities).

Однако Apartment, Author и Category являются "ссылочными свойствами навигации, указывающими на объекты", поэтому они должны быть полностью функциональными.

15.05.2019
  • Значит, это верно и для EF Core 3, верно? Я пытаюсь «подделать» навигационное свойство, выполнив var people = dbContext.People.Select(p => new { PersonName = p.Name, Cats = dbContext.AnimalsView.Where(a => a.Species == "cat" && a.OwnerID == p.ID }).ToArray() }). Но я всегда получаю только одну кошку на человека! 07.03.2020
  • @Simon_Weaver (1) Похоже на то (2) Довольно неожиданно, определенно ошибка. 07.03.2020
  • «Животные» на самом деле представляют собой вид, у которого нет набора ключей (поэтому нельзя просто использовать реквизиты навигации). Если я запускаю его «снаружи» в цикле, я получаю всех ожидаемых кошек в массиве c#, и все они находятся в соединении в выполняемом sql. 08.03.2020
  • @Simon_Weaver Действительно, я имел в виду, что вы нашли еще одну ошибку EF Core. На самом деле я получаю не только одного, но и одного и того же кота на каждого человека! 08.03.2020
  • мяу! О, интересно. Кот первого человека или последний? 08.03.2020
  • Первый (наверное). Какая разница, баг есть баг. 08.03.2020

  • 2

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

    попробуйте: _context.PostView.Include(лямбда => лямбда.Комментарий);

    14.05.2019
    Новые материалы

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..