我目前的问题似乎是几个月前遇到的突变版本(参见:Problems updating w/ EF4 repo & MVC2 - can't update many-to-many graph)。我可以创建一个新的游戏平台图,但我无法编辑现有图的平台端。因此,我无法在关系中添加/删除平台。
我正在使用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;
}
我的SaveGame方法:
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()
现有游戏实体的平台。我不确定如何使用我当前的设置优雅地执行此操作,因为我已经有一个新的游戏实体被发送到SaveGame()
,其中包含新平台列表。我觉得必须有更好,更优雅的做事方式。
那么,有什么想法吗?我试图保持对我的UI的引用(查看/编辑模型等)从爬进我的域层,所以我不希望我的repo直接处理我的AdminGameEditModel
。
答案 0 :(得分:1)
有no way to do it gracefully。你要做的是:
只需从删除某些平台的视图中发布新状态,就会丢失有关它们的信息,您必须先从数据库加载当前状态,以找到必须删除的平台。
另一个更残酷的方法是加载当前状态,清除平台集合(删除所有关系),然后添加新状态的所有平台。