2017-02-23 67 views
3

(с помощью Entity Framework 6.2)Обновление дочерних объектов в Entity Framework 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();' определенно не будет работать, так как 'Страны'' 'DbSet ', который не имеет свойства 'Cities';) –

+0

Хехе, спасибо за ответ Balazs. Не уверен, что кто-то из нас сбит с толку, но у DbSet действительно есть свойство Cities: ** public virtual ICollection Города {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; 
    } 
} 

Update:

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. Я действительно ошибся в своем оригинальном посте, о чем говорил Балаж. Я обновил сообщение - если вы посмотрите на мое второе предложенное решение (одно с циклом), это тоже не сработает? – user1900799

+0

Я думаю, что сначала вам нужно добавить эти города в 'dbcontext', например' dbcontext.cities.add (city) ', и тогда вы сможете добавить их в« страны »так же, как и вы. – Venky

+0

@ Venky нет, на самом деле, поскольку EF не может обнаружить изменения в связанных объектах, вам не нужно загружать их через контекст и обновление в родительской коллекции. На самом деле вам даже не нужно очищать коллекцию родителя. Очистка имеет смысл только в том случае, если вы действительно хотите удалить все объекты в коллекции и добавить все новые. –

Смежные вопросы