2017-02-23 3 views
3

(mit Entity Framework 6.2)Aktualisierung untergeordnete Objekte in Entity Framework 6

Ich habe die beiden folgenden Modelle/Einheiten:

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

und die folgenden DbContext

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

Meine Frage ist, : Wenn sich die Kinder des Country-Objekts ändern (dh die Städte), wie aktualisiere ich das?

Kann ich dies tun:

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

würde das funktionieren? Oder sollte ich spezifisch jede Stadt hinzufügen? d.h .:

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();' wird definitiv nicht funktionieren, da 'Countries' ein' DbSet 'ist, das keine' Cities' Eigenschaft hat;) –

+0

Hehe, danke für die Antwort Balazs. Nicht sicher, ob einer von uns verwirrt ist, aber nicht die DbSet in der Tat eine Cities-Eigenschaft: ** öffentliche virtuelle ICollection Städte {Get; einstellen; } ** – user1900799

+0

Nein, nicht das 'DbSet', sondern eine tatsächliche Entität, dh eine' Country' ** - Instanz ** ist, was es enthält. –

Antwort

6

Sie müssen Cities zu diesem bestimmten Country Objekt hinzufügen, die aktualisiert wird.

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

Hoffe, es hilft.

+0

Danke für die Antwort Venky. Ich hatte tatsächlich einen Fehler in meinem ursprünglichen Beitrag gemacht, wie Balázs darauf hingewiesen hat. Ich habe die Post aktualisiert - wenn Sie sich meine zweite vorgeschlagene Lösung (die mit der Schleife) ansehen, würde das auch nicht funktionieren? – user1900799

+0

Ich denke, zuerst müssen Sie diese Städte zu "dbcontext" wie "dbcontext.cities.add (city)" hinzufügen und dann sollten Sie in der Lage sein, sie zu "Ländern" hinzuzufügen, genau wie Sie. – Venky

+0

@Venky nein, nicht wirklich, da EF in der Lage ist, Änderungen in verknüpften Entitäten zu erkennen, müssen Sie es nicht über Kontext laden und in der übergeordneten Auflistung aktualisieren. In der Tat müssen Sie nicht einmal die Sammlung des Elternteils löschen. Das Löschen ist nur dann sinnvoll, wenn Sie tatsächlich alle Entitäten in der Sammlung löschen und alle neuen Entitäten hinzufügen möchten. –

Verwandte Themen