2009-11-08 86 views
7

我正在使用Northwind數據庫作爲此文章的示例,其中存在使用實體框架將分離實體保存回數據庫的問題。實體框架 - 保存對分離狀態的相關對象的更改

我有以下兩種方法來讓我的領土和地區:

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

到TerritoryDe​​scription的變化是成功保存,但改變區域不,在數據庫中它仍然是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(); 
     } 
    } 

我已經在記事本上編碼了,所以可能會有錯誤;如果有任何請評論,所以我會相應更新。