Запросите отношения многие-ко-многим с Entity Framework - PullRequest
0 голосов
/ 16 января 2019

Я новичок в C # Entity Framework. Я создал три класса - Страна - Площадь - Подрайон

Между страной и территорией существует отношение многих ко многим. Между Районом и Подрайоном существует еще одно отношение многих ко многим.

Страна может содержать много областей, но есть также области, которые принадлежат более чем одной стране). То же самое для Района и Подрайона.

Я создал соответствующие классы, и таблицы базы данных были созданы автоматически. Также были созданы таблицы для CountryAreas и SubAreaAreas, поэтому все выглядит хорошо. Также внешние ключи выглядят хорошо.

Я могу записывать данные в таблицы с помощью (см. Ниже).

Сейчас я борюсь за то, чтобы все страны с соответствующими районами и подрайонами были выбраны из базы данных.

Я прочитал пару постов и похоже, что мне не хватает базовых знаний о запросах LINQ и Entity Framework.

public class Country
{
    #region attributes
    [Key]
    public string Name { get; set; }
    public List<Area> Areas { get; set; } // virtual enabled lazy loading
    #endregion
}

public class Area
{
    #region attributes
    [Key]
    public string Name { get; set; }
    public virtual List<SubArea> Subareas { get; set; }
    public virtual List<Country> Countries { get; set; }
    #endregion
}

public class SubArea
{
    #region attributes
    [Key]
    public string Name { get; set; }
    public virtual List<Area> Areas { get; set; }
    #endregion
}

public class LocationScoutContext : DbContext
{
    public LocationScoutContext()
        : base("name=LocationScout")
    {
    }

    public DbSet<Country> Countries { get; set; }
    public DbSet<Area> Areas { get; set; }
    public DbSet<SubArea> SubAreas { get; set; }

}


// *** reading the data works fine ***
using (var db = new LocationScoutContext())
{
   db.Countries.Add(newCountry);
   db.SaveChanges();
}


// *** I tried this ***
var allCountries = new List<Countries>();
using (var db = new LocationScoutContext())
{
   var query = from c in db.Countries select c;
}

foreach (var c in query)
{
   allCountries.Add(c);
}

Я попробовал что-то похожее, как показано выше, но это, очевидно, не делает никакого объединения и просто дает мне названия стран с пустыми областями и субрегионами.

Любая помощь приветствуется: -)

1 Ответ

0 голосов
/ 16 января 2019

Попробуйте следующим образом. Это даст все countries с areas и subareas.

Для EF 6.x:

using (var db = new LocationScoutContext())
{
   var countries = db.Countries.Include(c => c.Areas.Select(a => a.SubAreas)).ToList();
}

Для EF Core:

using (var db = new LocationScoutContext())
{
   var countries = db.Countries.Include(c => c.Areas).ThenInclude(a => a.SubAreas).ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...