Entity Framework - Speichern von Änderungen an verbundenen Objekten im getrennten Zustand

c# entity-framework northwind

Frage

Ich verwende die Northwind-Datenbank als Beispiel für diesen Beitrag, bei dem ich Probleme habe, getrennte Entitäten mithilfe des Entitätsframeworks zurück in die Datenbank zu speichern.

Ich habe die folgenden zwei Methoden, um mir die Gebiete und Regionen zu besorgen:

    static List<Region> GetRegions()
    {
        using (NorthwindEntities entities = new NorthwindEntities())
        {
            entities.Region.MergeOption = System.Data.Objects.MergeOption.NoTracking;
            return entities.Region.ToList();
        }
    }

    static List<Territories> GetTerritories()
    {
        using (NorthwindEntities entities = new NorthwindEntities())
        {
            entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking;
            return entities.Territories.ToList();
        }
    }

Diese Methoden funktionieren gut und bringen mir die Sammlung von Objekten, die ich im freistehenden Zustand benötige.

Ich habe auch eine statische Methode namens SaveEntity, die sowohl eine alte als auch die aktuell bearbeitete Entität enthält. Dies ist wie folgt:

    static void SaveEntity(EntityObject oldEntity, EntityObject newEntity)
    {
        using (NorthwindEntities entities = new NorthwindEntities())
        {
            entities.Attach(oldEntity);
            entities.ApplyPropertyChanges(newEntity.EntityKey.EntitySetName, newEntity);
            entities.SaveChanges();
        }
    }

Diese Methode funktioniert teilweise, wenn die Änderungen am Objekt in der Datenbank gespeichert werden, aber Änderungen an der Beziehung verwandter Objekte nicht gespeichert werden.

Ich habe den folgenden Code, der die obigen Methoden als Beispiel aufruft:

            List<Territories> territories = GetTerritories();
        List<Region> regions = GetRegions();

        Region region = regions.Where(n => n.RegionID == 2).FirstOrDefault();
        Territories oldTerritory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault();
        Territories newTerritory = ObjectCopier.Clone<Territories>(oldTerritory);

        newTerritory.TerritoryDescription = "Hello World";
        newTerritory.Region = region;

        SaveEntity(oldTerritory, newTerritory);

Die Änderung an TerritoryDescription wurde erfolgreich gespeichert, die Änderung an Region jedoch nicht. In der Datenbank bleibt sie jedoch weiterhin RegionID = 1 anstelle von RegionID = 2.

Kann mir jemand Einblick geben, warum ApplyPropertyChanges keine Änderungen an verwandten Objekten vornimmt?

Weiß jemand auch, wie ich dieses Problem umgehen kann?

Beliebte Antwort

Anstatt Regionen und Gebiete getrennt abzurufen, rufen Sie beide in derselben Abfrage ab. Etwas wie (Ich gehe davon aus, dass Sie die Entität aktualisieren möchten, keine neue erstellen möchten);

static List<Region> GetTerritoriesWithRegions()
    {
        using (NorthwindEntities entities = new NorthwindEntities())
        {
            entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking;
            return entities.Territories.Include("Region").ToList();
        }
    }

Aktualisieren Sie sie dann wie folgt:

   List<Territories> territoriesWithRegions = GetTerritoriesWithRegions();
        Territories territory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault();
        territory.TerritoryDescription = "Hello World";
        Region region = territories.Where(p => p.Any(q => q.Region.RegionID == 2)).FirstOrDefault().Region;
        territory.Region = region;

        SaveEntity(territory);

Und rette sie;

static void SaveEntity(EntityObject entity)
    {
        using (NorthwindEntities entities = new NorthwindEntities())
        {
            entities.Attach(entity);
            entities.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);            
            entities.SaveChanges();
        }
    }

Ich habe dies auf dem Notizblock codiert, so dass Fehler auftreten können. Wenn ja, bitte kommentieren, damit ich das Update entsprechend aktualisieren werde.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum