我目前的問題看起來像幾個月前遇到的突變版本(請參閱: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
。
感謝至少證實我對移除現有平臺的直覺。 –