Entity Framework 6 в .NET Core 2.2 - один ко многим возвращает пустой список - PullRequest
0 голосов
/ 25 сентября 2019

Я трачу весь день на исправление этой ошибки, но ничего не произошло.Я использую Entity Framework 6 с .NET Core 2.2.

У меня есть Driver класс, который имеет список из множества DailyRoute:

public class Driver
{
    [Key]
    public Guid DriverId { get; protected set; }
    public Vehicle Vehicle { get; protected set; }

    private ISet<DailyRoute> _dailyRoutes = new HashSet<DailyRoute>();

    public virtual ICollection<DailyRoute> DailyRoutes
    {
        get => _dailyRoutes;

        set => _dailyRoutes = new HashSet<DailyRoute>(value);
    }

    public DateTime UpdatedAt { get; private set; }

    protected Driver() 
    {
    }

    public Driver (Guid userid)
    {
        DriverId = userid;
    }
}

Это класс DailyRoute:

public class DailyRoute
{
    public Guid Id { get; set; }
    public DateTime DateTime { get; protected set; }

    private ISet<PassengerNode> _passengerNodes = new HashSet<PassengerNode>();

    public Route Route { get; protected set; }

    public Driver Driver { get; set; }

    public ICollection<PassengerNode> PassengerNodes => _passengerNodes;

    public DailyRoute()
    {
    }

    protected DailyRoute(DateTime dateTime, Route route, Guid id)
    {
        Id = id;
        Route = route;
        DateTime = dateTime;
    }
}

Проблема в том, что я отлаживаю программу, и когда я обновляю пользователя и затем показываю фактический элемент dbcontext, был драйвер со списком dailyRoute, но при следующем запросе, когда я пытаюсь показать все драйверы, яполучил водителя с пустым ежедневным списком маршрутов.В базе данных у меня есть таблица с dailyRoute с идентификатором драйвера, и этот идентификатор существует в таблице Driver.

Класс dbContext:

public class PassengerContext : DbContext
{
    public PassengerContext(DbContextOptions<PassengerContext> options): base(options)
    {
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Driver> Drivers { get; set; }
    public DbSet<RefreshToken> RefreshTokens { get; set; }
    public DbSet<DailyRoute> DailyRoutes { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Driver>()
            .HasMany(e => e.DailyRoutes).WithOne(k => k.Driver).IsRequired();
    }
}

Это класскогда я пытаюсь получить драйвер, драйвер существует, но список dailyRoute пуст;

public class DriverRepository : IDriverRepository
{
    private readonly PassengerContext _passengerContext;

    public DriverRepository(PassengerContext passengerContext)
    {
        _passengerContext = passengerContext;
    }

    public async Task<Driver> GetAsync(Guid userId)
    {
        return await _passengerContext.Drivers.SingleOrDefaultAsync(x => x.DriverId == userId);
    }

Driver таблица:

The driver table

DailyRoute таблица:

DailyRoute table

1 Ответ

0 голосов
/ 25 сентября 2019

Существуют разные политики загрузки в объектной структуре, такие как «полная загрузка» и «отложенная загрузка».По умолчанию это будет отложенная загрузка.

Если вы хотите, чтобы связанные сущности были загружены, то вы должны выполнить загрузку с нетерпением.Вы можете сделать это, добавив функцию Include в ваш запрос linq. Ссылка , вероятно, может вам помочь.

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

 return await _passengerContext.Drivers.Include(x => x.DailyRoutes).SingleOrDefaultAsync(x => x.DriverId == userId);
...