Отношения между классами entityframeworkcore code-first - PullRequest
0 голосов
/ 23 апреля 2019

Я новичок в ядре Entity Framework, но раньше я использовал Linq to SQL, сначала создав базу данных.Сначала я пытаюсь написать код с сущностью.

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

Простой случай: у меня есть Class Chat, который связан со многими многими отношениями с классом User.

Chat chat

public int Id { get; set; }
public int StarterUserId { get; set; }
public User StarterUser { get; set; }
public int OtherUserId { get; set; }
public User OtherUser { get; set; }

Класс пользователя имеет свойство Id.

public int Id { get; set; }
public List<Chat> InChats { get; set; }
public List<Chat> OutChats { get; set; }

И я определил в методе OnModelCreating:

modelBuilder.Entity<Chat>()
            .HasOne(x => x.StarterUser)
            .WithMany(m => m.OutChats)
            .HasForeignKey(x => x.StarterUserId);
modelBuilder.Entity<Chat>()
            .HasOne(x => x.OtherUser)
            .WithMany(m => m.InChats)
            .HasForeignKey(x => x.OtherUserId);

Когда я получаю объект чата и наблюдаю за его свойствами, у меня OtherUser как объект User класс и OtherUserId=26 (ХОРОШО)

Но у меня есть StarterUserId=1, и у меня есть StarterUser as null.

В базе данных я вижу отношения, которые определены правильно.StarterUserId и OtherUserId оба являются внешними ключами в Users Таблица

Почему это так?Как я могу это исправить?

Решено: Я включил отложенную загрузку и не могу получить соответствующие данные.

  1. Я установил Microsoft.EntityFrameworkCore.Proxies пакет из nuget
  2. При добавлении DbContext я включил отложенную загрузку, используя .UseLazyLoadingProxies()
  3. Изменил модификаторы с public на public virtual для свойств, которые мне нужны для получения связанных данных

1 Ответ

0 голосов
/ 23 апреля 2019

Проблема в вашем запросе, но вы не добавили свой запрос к вопросу !!. Я предполагаю, что вам не хватает eager-loading связанных объектов.

Таким образом, вам необходимо загрузить OtherUser, используя .Inlcude в вашем запросе, и ваш запрос должен выглядеть следующим образом:

_dbContext.Chats.Include(c => c.StarterUser)
                .Include(c => c.OtherUser).Where(c => c.Id == 1).FirstOrDefault();

Для более подробной информации: Загрузка связанных данных в EF Core

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