Ninject MVC 2 - EF 4 ObjectContext的问题

时间:2012-05-09 18:13:02

标签: c#-4.0 asp.net-mvc-2 ninject.web.mvc

我一直在处理这个问题,但似乎仍无法找到解决方案。我有几个包装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,我希望与每个请求的所有回购共享。

1 个答案:

答案 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添加到您的项目中?