我一直在处理这个问题,但似乎仍无法找到解决方案。我有几个包装EF 4 ObjectContext的存储库。一个例子如下:
public class HGGameRepository : IGameRepository, IDisposable
{
private readonly HGEntities _context;
public HGGameRepository(HGEntities context)
{
this._context = context;
}
// methods
public void SaveGame(Game game)
{
if (game.GameID > 0)
{
_context.ObjectStateManager.ChangeObjectState(game, System.Data.EntityState.Modified);
}
else
{
_context.Games.AddObject(game);
}
_context.SaveChanges();
}
public void Dispose()
{
if (this._context != null)
{
this._context.Dispose();
}
}
}
我有以下NinjectModule:
public class DIModule : NinjectModule
{
public override void Load()
{
this.Bind<HGEntities>().ToSelf();
this.Bind<IArticleRepository>().To<HGArticleRepository>();
this.Bind<IGameRepository>().To<HGGameRepository>();
this.Bind<INewsRepository>().To<HGNewsRepository>();
this.Bind<ErrorController>().ToSelf();
}
}
由于我使用的是MVC 2扩展,因此这些绑定默认为InRequestScope()
。
我的问题是没有正确处理ObjectContext。我得到了这里描述的内容:https://stackoverflow.com/a/5275849/399584具体来说,我得到一个InvalidOperationException,指出:
无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。
每次我尝试更新实体时都会发生这种情况。
如果我将我的回购设置为绑定InSingletonScope()
它可行,但似乎是一个坏主意。
我做错了什么?
编辑:为了清楚起见,我只有一个ObjectContext,我希望与每个请求的所有回购共享。
答案 0 :(得分:1)
您必须在模块中指定InRequestScope()
。基于此article默认为瞬态,这就是您获得多个上下文的原因。
public class DIModule : NinjectModule
{
public override void Load()
{
this.Bind<HGEntities>().ToSelf().InRequestScope();
this.Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope();
this.Bind<IGameRepository>().To<HGGameRepository>().InRequestScope();
this.Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope();
this.Bind<ErrorController>().ToSelf().InRequestScope();
}
}
您是否也通过nuget包管理器或旧时尚方式将ninject添加到您的项目中?