Entity Framework: сначала объект возвращается с пустым списком, но затем список заполняется правильно - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть следующий класс:

public class User
{
   public int Id { get; set; }
   public List<User> Connections { get; set; }

   //other properties

   public User()
   {
    Connections = new List<User>();
   }
}

Затем у меня есть класс DataContext для хранения:

 public class DataContext : DbContext
 {
     public DataContext() { }

     public DataContext(DbContextOptions<DataContext> options) : base(options) { }

     public virtual DbSet<User> Users { get; set; }
 }

И класс UserService:

public class UserService: IUserService
{
   private DataContext _context;

   public UserService(DataContext context)
   {
      _context = context;
   }

   public User GetById(int id)
   {
      return _context.Users.Find(id);
   }
   ...
}

Теперь предположим, что я правильно сохранил 2 пользователей и добавил друг друга в соответствующие списки соединений.

Проблема заключается в следующем фрагменте кода:

var user1 = _userService.GetById(userId);

 ---> Here user1.Connections is an empty list (unexpected)

var results = anotherList.Select(x=> 
{

   ---> Here user1.Connections have one object inside (the other user as expected)

});

Я думал, что это потому, что Список еще не был заполнен, поскольку к нему еще никогда не обращались, но у меня также есть проблема со следующей конечной точкой в ​​контроллере:

var userId = int.Parse(User.Identity.Name);

var user1 = _userService.GetById(userId);

var connectionsInfo = user1.Connections.Select(x => new
{
   Id = x.Id,
   //map other properties
});

return Ok(connectionsInfo);
//this time an empty list is returned in the response, instead of a list with a single object

Я читал, что это может быть связано с циклической зависимостью, но я не получаю любое исключение.

Кроме того, я не понимаю, почему в одном случае список заполняется после, а в другом случае вообще не заполняется.

Есть идеи, что может быть причиной этого?

1 Ответ

3 голосов
/ 23 февраля 2020

Также я не понимаю, почему в одном случае список заполняется после, а в другом случае вообще не заполняется.

Это Lazy Loading особенность в структуре лица. Ленивая загрузка означает задержка загрузки связанных данных до тех пор, пока вы специально не запросите их. Для более подробного объяснения и глубокого погружения вы можете просмотреть эту хорошую статью .

Entity Framework поддерживает три способа загрузки связанных данных - ускоренная загрузка, отложенная загрузка и явная загрузка. для вашего сценария, он предпочел бы использовать нетерпеливый способ загрузки. для достижения этой цели EF имеет метод Include(). Таким образом, вы можете обновить свой метод GetById, как показано ниже:

public User GetById(int id)
{
   return _context.Users
             .Include(item => item.Connections)
             .Find(id);
}

С помощью приведенного выше запроса, когда вы найдете определенного пользователя c, его соединения загружаются в то же время. удачи.

...