【发布时间】:2012-05-10 02:48:40
【问题描述】:
我一直在处理这个问题,但似乎仍然找不到解决方案。我有几个包装 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 想与每个请求的所有存储库共享。
【问题讨论】:
-
使用
InSingletonScope()没有任何危害。 -
线程/缓存呢?老实说,我不确定在这种情况下如何工作(我来自 PHP)。
标签: c#-4.0 asp.net-mvc-2 ninject.web.mvc