[英]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.