Entity Framework Core: Include не загружает отношения в полностью определенные отношения - PullRequest
1 голос
/ 05 мая 2020

Учитывая следующие три класса:

public class Make
{
    public int MakeId { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public ICollection<Model> Models { get; set; }

    public Make()
    {
        Models = new Collection<Model>();
        Name = string.Empty;
    }
}
public class Model
{
    public int ModelId { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public Make Make { get; set; }
    public int MakeId { get; set; }

    Model()
    {
        Name = string.Empty;
        Make = new Make();
    }
}
public class VegaDbContext : DbContext
{
    public VegaDbContext(DbContextOptions<VegaDbContext> options) : base(options)
    {

    }
    public DbSet<Make> Makes { get; set; }
    public DbSet<Model> Models { get; set; }
}

Я хочу сделать доступной конечную точку API, которая возвращает Make и связанные модели. Функция для этого выглядит следующим образом:

[HttpGet("/api/makes")]
public async Task<IEnumerable<MakeResource>> GetMakes()
{
    // Here Models is not being loaded!
    var makes = await dbContext.Makes.Include(m => m.Models).ToListAsync();

    // This is manually loading the required data, which works. But I don't want to do this.
    foreach (var make in makes)
    {
        make.Models = await dbContext.Models.Where(m => m.MakeId == make.MakeId).ToListAsync();
    }

    // This mapper part is not of interest
    return mapper.Map<IList<Make>, IList<MakeResource>>(makes);
}

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

Похоже, с введением EF * произошли некоторые изменения. 1025 * 3.0 и вроде раньше работало. Понятия не имею, почему это так. Если у кого-то есть идея, буду рад! База данных была создана с использованием первых миграций кода. Версии:

.NET Core SDK (reflecting any global.json):
 Version:   3.1.103
 Commit:    6f74c4a1dd

Runtime Environment:
 OS Name:     manjaro
 OS Version:  
 OS Platform: Linux
 RID:         arch-x64
 Base Path:   /usr/share/dotnet/sdk/3.1.103/

Host (useful for support):
  Version: 3.1.3
  Commit:  ed88943d24

.NET Core SDKs installed:
  3.1.103 [/usr/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

База данных заполнена:

Makes Models

1 Ответ

1 голос
/ 05 мая 2020

Мне удалось воспроизвести проблему для EF Core In-Memory Provider Database Provider , прокомментировав строку Make = new Make(); в конструкторе Model, проблема была решена.

...