繁体   English   中英

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

[英]EF4 not updating many-to-many graph; Or, is there a better way to handle many-to-many in EF4?

我当前的问题似乎是几个月前遇到的问题的一个变体版本(请参阅: 更新带有EF4存储库和MVC2的问题-无法更新多对多图 )。 我可以创建一个新的Game-Platform图,但是不能编辑现有图的Platform端。 因此,我无法从关系中添加/删除平台。

我正在使用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(视图/编辑模型等)的引用进入我的域层,所以我不希望我的AdminGameEditModel直接处理AdminGameEditModel

没有办法优雅地做到这一点 您要做的是:

  • 保持视图模型不变(新状态)
  • 从数据库及其所有平台加载游戏(当前持久状态)
  • 编写将通过新状态并在当前状态下添加或修改平台的代码
  • 编写将通过当前状态的代码,并删除新状态中未包括的所有平台
  • 保存更改

只需在删除了某些平台的视图中发布新状态后,便会丢失有关它们的信息,并且必须首先从数据库中加载当前状态以查找必须删除的平台。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM