2009-11-08 14 views
7

Używam bazy danych Northwind jako przykładu dla tego wpisu, w którym mam problem z zapisaniem odłączonych jednostek z powrotem do bazy danych przy użyciu struktury encji.Struktura obiektu - zapisywanie zmian w obiektach pokrewnych w stanie wolnostojącym

Mam następujące dwa sposoby, żeby mnie terytoria i regiony:

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

tych metod zarówno drobne prace i dostać mi kolekcję obiektów wymagam w jednorodzinnym państwa.

Mam też metodę statyczną o nazwie SaveEntity, który odbywa się zarówno starej jednostki i aktualnie editted podmiotu, to w następujący sposób:

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

Metoda ta częściowo działa, gdzie są zapisane zmiany przedmiotu do bazy danych, ale wszelkie zmiany relacji powiązanych obiektów nie są zapisywane.

Mam następujący kod wywołujący powyższe metody jak moim przykładzie:

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

Zmiana do TerritoryDescription się pomyślnie, ale zmiana na region nie jest w bazie danych nadal pozostaje regionId = 1 zamiast RegionID = 2.

Czy ktoś może mi dać wgląd w to, dlaczego ApplyPropertyChanges nie propaguje zmian w powiązanych obiektach?

Czy ktoś wie, jak rozwiązać ten problem?

Odpowiedz

1

Myślę, że możesz znaleźć odpowiedzi tutaj (Alex James jest lepszy). Entity Framework Updating with Related Entity

Zasadniczo powodem jest to, że w relacjach EF są również obiekty i mają statusy takie jak encje (usunięte, dodane, ...), więc w kontekście musiałbyś mieć również oryginalną wartość odniesienia.

2

Zamiast pobierać regiony i obszary oddzielnie, należy pobrać oba z nich w tym samym zapytaniu. Coś jak (zakładam, że chcesz zaktualizować encję, nie chcesz tworzyć nowej);

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

Następnie zaktualizuj je w następujący sposób;

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

I zachowaj je;

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

Zapisałem to w notatniku, aby mogły występować błędy; jeśli tak, proszę skomentuj, więc zaktualizuję się odpowiednio.

Powiązane problemy