这与我的problem here继续。
我正在尝试使用solution Julie Lerman gave me a few months ago。我目前正在使用以下内容生成一个预先附加到我的ObjectContext的新游戏实体:
Game game = _gameRepository.GetGame(formData.GameID);
AutoMapper.Mapper.Map<AdminGameEditModel, Game>(formData, game);
在存储库中,我尝试将游戏附加到OC,其状态设置为“已添加”,如下所示:
public Game GetGame(int id)
{
if (id > 0)
{
return _siteDB.Games.Include("Genre").Include("Platforms").SingleOrDefault(g => g.GameID == id);
}
else
{
Game game = _siteDB.Games.CreateObject();
_siteDB.Games.AddObject(game);
return game;
}
}
现在,为了清楚起见,这里是我的控制器的构造函数:
public AdminController(IArticleRepository articleRepository, IGameRepository gameRepository, INewsRepository newsRepository)
{
_articleRepository = articleRepository;
_gameRepository = gameRepository;
_newsRepository = newsRepository;
Mapper.CreateMap<AdminGameEditModel, Game>()
.BeforeMap((s, d) =>
{
if (d.Platforms.Count > 0)
{
Platform[] existing = d.Platforms.ToArray();
foreach (var plat in existing)
{
d.Platforms.Remove(plat);
}
}
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());
}
如您所见,_gameRepository应该是相同的,因为它是在控制器构造上创建的。反过来,这意味着_gameRepository的OC对于游戏和平台应该是相同的。然而,在这种情况下,我仍然会得到一个例外情况:
无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。
肯定会发生一些事情,这就是为什么我想知道我是否能够实际跟踪实体附加到哪个ObjectContext。它们应该全部附加到同一个OC,但例外情况除外。
也许它与我使用Ninject(vanilla版本,不是 MVC定制版本)在控制器中注入存储库有关。无论问题是什么,它似乎都不明显。任何帮助都会非常赞赏。
编辑:存储库的ObjectContext:
public class HGGameRepository : IGameRepository
{
private HGEntities _siteDB = new HGEntities();
// rest of class code
}
Ninject绑定:
private class HandiGamerServices : NinjectModule
{
public override void Load()
{
Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope();
Bind<IGameRepository>().To<HGGameRepository>().InRequestScope();
Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope();
Bind<ErrorController>().ToSelf().InRequestScope();
}
}
答案 0 :(得分:2)
您可以通过以下方式询问ObjectContext是否有对某个对象的引用:
ObjectStateEntry ose;
bool isInContext = someContext.ObjectStateManager.TryGetObjectStateEntry(someObject, out ose);
答案 1 :(得分:1)
有问题的部分是这个
public class HGGameRepository : IGameRepository
{
private HGEntities _siteDB = new HGEntities();
// rest of class code
}
我相信所有存储库在创建时都会创建自己的新上下文。而不是这个你应该使用构造函数注入
public class HGGameRepository : IGameRepository
{
private HGEntities _siteDB;
public HGGameRepository(HGEntities entities)
{
_siteDB= entities
}
}
然后在你的Ninject模块中包含这个
Bind<HGEntities>().ToSelf().InRequestScope();
这样您的存储库将共享相同的上下文。