2017-02-23 83 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能夠發現相關實體的變化,所以您不需要通過上下文加載它並在父集合中進行更新。事實上,你甚至不需要清除父母的收藏。清除它只有在你確實想刪除集合中的所有實體並添加所有新實體時纔有意義。 –