实体框架:以多对多关系添加新对象

时间:2019-01-16 18:44:16

标签: c# entity-framework linq entity-framework-6

我是C#实体框架(6)的新手。我创建了三个类-国家-区域-子区域

国家和地区之间存在多对多关系。区域和分区之间还有另一对多的关系。

一个国家可以包含许多区域,但是也有属于多个国家的区域。面积和分区面积相同。

我创建了各自的类,并且数据库表已自动创建。也已经创建了CountryAreas和SubAreaAreas的表,因此看起来都不错。另外,外键看起来还不错。

当我创建一个新的Country Object(国家/地区对象)并将各自的Areas和SubAreas添加到数据库时,效果很好(请参见下面的代码)。

我现在试图仅将一个新的Area(带有新的SubAreas)添加到现有的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;
}

0 个答案:

没有答案