2017-02-23 70 views
3

(使用实体框架6.2)更新的孩子在实体框架对象6

我有以下两种型号/实体:

public class City 
    { 
     public int CityId { get; set; } 
     public string Name { get; set; } 
    } 

public class Country 
    { 
     public Country() 
     { 
      Cities new HashSet<City>(); 
     } 

     public int CountryId { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<City> Cities { get; set; } 
    } 

而下面的DbContext

public DbSet<Country> Countries { get; set; } 

我的问题是:如果国家对象的孩子改变了(即城市),我该如何更新?

我可以这样做:

List<City> cities = new List<City>(); 
// Add a couple of cities to the list... 
Country country = dbContext.Countries.FirstOrDefault(c => c.CountryId == 123); 
if (country != null) 
{ 
    country.Cities.Clear(); 
    country.Cities = cities; 
    dbContext.SaveChanges(); 
} 

将这项工作?或者我应该专门添加每个城市?即:

List<City> cities = new List<City>(); 
// Add a couple of cities to the list... 
Country country = dbContext.Countries.FirstOrDefault(c => c.CountryId == 123); 
if (country != null) 
{ 
    country.Cities.Clear(); 
    foreach (City city in cities) 
     country.Cities.Add(city); 
    dbContext.SaveChanges(); 
} 
+0

'dbContext.Countries.Cities.Clear();'绝对不会工作,因为'Countries'是'DbSet ''没有'Cities'属性;} –

+0

呵呵,谢谢你的回复Balazs。不知道我们中的一个是否感到困惑,但是DbSet 确实没有Cities属性: ** public virtual ICollection Cities {get;组; } ** – user1900799

+0

不,不是'DbSet'而是一个实际的实体,即一个'Country' **实例**是包含它的东西。 –

回答

6

您需要添加Cities的正在更新特定Country对象。

public Country Update(Country country) 
{ 
    using (var dbContext =new DbContext()) 
    { 
     var countryToUpdate = dbContext.Countries.SingleOrDefault(c => c.Id == country.Id); 
     countryToUpdate.Cities.Clear(); 
     foreach (var city in country.Cities) 
     { 
      var existingCity = 
       dbContext.Cities.SingleOrDefault(
        t => t.Id.Equals(city.cityId)) ?? 
       dbContext.Cities.Add(new City 
       { 
        Id = city.Id, 
        Name=city.Name 
       }); 

      countryToUpdate.Cities.Add(existingCity); 
     } 
     dbContext.SaveChanges(); 
     return countryToUpdate; 
    } 
} 

更新:

public class City 
    { 
     public int CityId { get; set; } 
     public string Name { get; set; } 

     [ForeignKey("Country")] 
     public int CountryId {get;set;} 
     public virtual Country Country {get; set;} 
    } 

希望它能帮助。

+0

感谢您的答复Venky。正如Balázs所指出的那样,我原来的职位实际上犯了一个错误。我更新了这篇文章 - 如果你看看我提出的第二个解决方案(带有循环的解决方案),那么这样做也行不通? – user1900799

+0

我想首先你需要把这些城市添加到''dbcontext''就像'dbcontext.cities.add(city)',然后你应该可以像你一样将它们添加到'countries'。 – Venky

+0

@Venky否,不是真的,因为EF能够发现相关实体的变化,所以您不需要通过上下文加载它并在父集合中进行更新。事实上,你甚至不需要清除父母的收藏。清除它只有在你确实想删除集合中的所有实体并添加所有新实体时才有意义。 –