Entitiy Framework: добавление новых объектов в отношениях «многие ко многим» - PullRequest
0 голосов
/ 16 января 2019

Я новичок в C # Entity Framework (6). Я создал три класса - Страна - Область - Субрегион

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

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

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

Когда я создаю новый объект Country с соответствующими областями и подрайонами, добавление в базу данных работает нормально (см. Код ниже).

Теперь я попытался добавить только новую область (с новыми подрайонами) к существующему объекту Country, но я не знаю, как это должно работать.

Фактически, я хочу добавить новый объект Area (или запись базы данных) и позволить Entity Framework обновить все отношения (и соответствующие таблицы). То же самое относится и к тем случаям, когда я пытался добавить новый объект SubArea для существующей области.

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

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

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

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

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; }

}

// *** this works fine
internal static bool AddCountry(Country newCountry, out string errorMessage)
{
   bool success = true;
   errorMessage = string.Empty;

   try
   {
      using (var db = new LocationScoutContext())
      {
         db.Countries.Add(newCountry);
         db.SaveChanges();
      }
   }
   catch (Exception e)
   {
      errorMessage = BuildDBErrorMessages(e);
      success = false;
   }

   return success;
}

// *** this does not work
internal static bool UpdateCountry(Country upCountry, out string errorMessage)
{
   bool success = true;
   errorMessage = string.Empty;

   try
   {
      using (var db = new LocationScoutContext())
      {
         var country = db.Countries.SingleOrDefault(o => o.Name == upCountry.Name);
         country.Areas = upCountry.Areas;
         db.Entry(country).State = EntityState.Modified;

         var result = db.SaveChanges();
       }
    }
    catch (Exception e)
    {
       errorMessage = BuildDBErrorMessages(e);
       success = false;
    }

    return success;
}
...