EF4不更新多对多图;或者,有没有更好的方法来处理EF4中的多对多?

时间:2011-06-23 01:24:35

标签: c# asp.net-mvc-2 entity-framework-4 automapper

我目前的问题似乎是几个月前遇到的突变版本(参见: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

1 个答案:

答案 0 :(得分:1)

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

  • 按原样获取您的视图模型(新状态)
  • 从数据库加载游戏及其所有平台(当前持久化状态)
  • 编写一个代码,该代码将通过新状态并添加或修改当前状态的平台
  • 编写将通过当前状态并删除未包含在新状态中的所有平台的代码
  • 保存更改

只需从删除某些平台的视图中发布新状态,就会丢失有关它们的信息,您必须先从数据库加载当前状态,以找到必须删除的平台。

另一个更残酷的方法是加载当前状态,清除平台集合(删除所有关系),然后添加新状态的所有平台。