EF Core включает список списка - PullRequest
0 голосов
/ 23 апреля 2019

У меня очень простая модель.основной класс, Recipe, содержит список RecipeItem.Каждый RecipeItem имеет список RecipeItemComponents.

Используя контекст Entity Framework, я могу сделать это:

var ret = await _context.Recipes
.Include(x => x.RecipeItems)
.ToListAsync();

Этот код возвращает рецепты с RecipeItems, но для каждого RecipeItems у меня нетRecipeItemsComponent список.Это имеет смысл, поскольку я не включаю их, но я не знаю, как это сделать.

Спасибо

Ответы [ 2 ]

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

Вот мой пример рабочего кода

Модели

public class Parent
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual List<Child1> Child1s { get; set; }
}

 public class Child1
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int ParentId { get; set; }
    public Parent Parent { get; set; }

    public virtual List<Child2> Child2s { get; set; }
}

public class Child2
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int Child1Id { get; set; }
    public Child1 Child1 { get; set; }
}

В контексте класса БД

public class TestDbContext : DbContext
{
    public TestDbContext(DbContextOptions<TestDbContext> options)
        : base(options)
    {
        Database.EnsureCreated();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasMany(x => x.Child1s).WithOne(x => x.Parent).HasForeignKey(x => x.ParentId);
        modelBuilder.Entity<Child1>().HasMany(x => x.Child2s).WithOne(x => x.Child1).HasForeignKey(x => x.Child1Id);

        this.InitialData(modelBuilder);
        base.OnModelCreating(modelBuilder);
    }

    protected void InitialData(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasData(new Parent[]
        {
            new Parent
            {
                Id = 1,
                Name = "Parent 1",
            }
        });

        modelBuilder.Entity<Child1>().HasData(new Child1[]
        {
            new Child1
            {
                Id = 1,
                Name = "Child 1 1",
                ParentId = 1,
            }
        });
        modelBuilder.Entity<Child2>().HasData(new Child2[]
        {
            new Child2
            {
                Id = 1,
                Name = "Child 2 1",
                Child1Id = 1
            }
        });
    }

    public DbSet<Parent> Parent { get; set; }
    public DbSet<Child1> Child1s { get; set; }
    public DbSet<Child2> Child2s { get; set; }
}

Контроллер

public class ParentsController : Controller
{
    private readonly TestDbContext _context;

    public ParentsController(TestDbContext context)
    {
        _context = context;
    }        public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var parent = await _context.Parent
            .Include(x=>x.Child1s).ThenInclude(x=>x.Child2s)
            .FirstOrDefaultAsync(m => m.Id == id);
        if (parent == null)
        {
            return NotFound();
        }

        return View(parent);
    }
}

Здесьэто вывод enter image description here

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

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

.Include("RecipeItems.RecipeItemsComponents")

Для любопытных, документация для этой перегрузки здесь: https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.entityframeworkqueryableextensions.include?view=efcore-2.1#Microsoft_EntityFrameworkCore_EntityFrameworkQueryableExtensions_Include__1_System_Linq_IQueryable___0__System_String_

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