2009-11-08 2 views
7

Я использую базу данных Northwind в качестве примера для этого сообщения, когда у меня возникает проблема сохранения отдельных элементов обратно в базу данных с использованием структуры сущности.Entity Framework - сохранение изменений связанных объектов в отдельном состоянии

У меня есть следующие два способа получить мне территории и регионы:

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

Этих методы, как работает отлично и получить мне коллекцию объектов, которые мне нужно в отдельном государстве.

У меня также есть статический метод SaveEntity, который принимает как в старой организации и в настоящий момент Editted сущности, это выглядит следующим образом:

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

Этот метод частично работает, когда изменения объекта будут сохранены вплоть до базы данных, но любые изменения в отношении связанных объектов не сохраняются.

Я следующий код вызова выше методы, как мой пример:

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

Переход к TerritoryDescription успешно сохранен, но изменения в регионе нет, в базе данных она по-прежнему остается RegionID = 1 вместо RegionID = 2.

Может ли кто-нибудь дать мне некоторое представление о том, почему ApplyPropertyChanges не пропагандирует изменения связанных объектов?

Кроме того, знает ли кто-нибудь, как я могу обойти эту проблему?

ответ

1

Думаю, вы можете найти ответы здесь (Алекс Джеймс лучше). Entity Framework Updating with Related Entity

По сути, причина в том, что в EF-отношениях тоже есть объекты и имеют статусы, такие как сущности (удаленные, добавленные, ...), поэтому вам также потребуется иметь исходное ссылочное значение в контексте.

2

Вместо того, чтобы выбирать области и территории отдельно, выберите оба из них в одном запросе. Что-то вроде (я предполагаю, что вы хотите обновить объект, не хотите создавать новый);

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

Затем обновите их следующим образом;

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

И сохранить их;

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

Я закодировал это в блокноте, чтобы могли быть ошибки; если есть какие-либо комментарии, поэтому я буду обновлять соответственно.

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