2011-06-23 80 views
0

我目前的問題看起來像幾個月前遇到的突變版本(請參閱:Problems updating w/ EF4 repo & MVC2 - can't update many-to-many graph)。我可以創建一個新的遊戲平臺圖,但是我無法編輯現有圖的平臺一側。所以,我無法從關係中添加/刪除平臺。EF4不更新多對多圖;或者,有沒有更好的方法來處理EF4中的多對多?

我正在使用AutoMapper將傳入數據映射到實體。然後,我手動將Game實體附加到存儲庫中的ObjectContext,並根據是創建新實體圖還是更新現有圖來手動設置其EntityState。這裏是我的當前設置:

AutoMapper映射:

Mapper.CreateMap<AdminGameEditModel, Game>() 
    .BeforeMap((s, d) => 
    { 
     foreach (var platId in s.PlatformIDs) 
     { 
      Platform newPlat = _gameRepository.GetPlatform(platId); 

      d.Platforms.Add(newPlat); 
     } 
    }) 
    .ForMember(dest => dest.BoxArtPath, opt => opt.Ignore()) 
    .ForMember(dest => dest.IndexImagePath, opt => opt.Ignore()) 
    .ForMember(dest => dest.Cons, opt => opt.MapFrom(src => String.Join("|", src.Cons))) 
    .ForMember(dest => dest.Pros, opt => opt.MapFrom(src => String.Join("|", src.Pros))) 
    .ForMember(dest => dest.LastModified, opt => opt.UseValue(DateTime.Now)) 
    .ForMember(dest => dest.Platforms, opt => opt.Ignore()); 

我回購的GetPlatform方法:

public Platform GetPlatform(int id) 
{ 
    Platform plat = _siteDB.Platforms.FirstOrDefault(pl => pl.PlatformID == id); 
    _siteDB.Detach(plat); 

    return plat; 
} 

我的祕技方法:

public void SaveGame(Game game) 
{ 
    _siteDB.Games.Attach(game); 

    if (game.GameID > 0) 
    { 
     _siteDB.ObjectStateManager.ChangeObjectState(game, System.Data.EntityState.Modified); 
    } 
    else 
    { 
     _siteDB.ObjectStateManager.ChangeObjectState(game, System.Data.EntityState.Added); 
    } 

    _siteDB.SaveChanges(); 
} 

我唯一的想法是,我需要Remove()現有Game實體的平臺。我不知道如何用我目前的設置優雅地做到這一點,因爲我已經有一個傳入的新遊戲實體被髮送到SaveGame(),其中有新的平臺列表。我覺得必須有更好,更優雅的做事方式。

那麼,有什麼想法?我試圖保持對我的用戶界面(查看/編輯模型等)的引用進入我的域名層,所以我不希望我的回購直接處理我的AdminGameEditModel

回答

1

no way to do it gracefully。你所要做的是:

  • 讓您的視圖模型是(一個新的狀態)
  • 從數據庫裝載遊戲連同其所有的平臺(當前持續狀態)
  • 寫代碼將通過新的狀態和當前狀態
  • 添加或修改平臺寫代碼將通過當前狀態,並消除所有平臺,不包括在新的狀態
  • 保存更改

只要從刪除某些平臺的視圖中發佈新狀態,就會丟失有關它們的信息,並且必須先從數據庫加載當前狀態以查找必須刪除哪些平臺。

另一個更殘酷的方法是加載當前狀態,清理平臺集合(刪除所有關係),然後添加新狀態的所有平臺。

+0

感謝至少證實我對移除現有平臺的直覺。 –

相關問題