Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 Ninject MVC 2-EF 4 ObjectContext的问题_C# 4.0_Asp.net Mvc 2_Ninject.web.mvc - Fatal编程技术网

C# 4.0 Ninject MVC 2-EF 4 ObjectContext的问题

C# 4.0 Ninject MVC 2-EF 4 ObjectContext的问题,c#-4.0,asp.net-mvc-2,ninject.web.mvc,C# 4.0,Asp.net Mvc 2,Ninject.web.mvc,我处理这个问题已经有一段时间了,但似乎仍然找不到解决办法。我有几个封装EF4 ObjectContext的存储库。一个例子如下: public class HGGameRepository : IGameRepository, IDisposable { private readonly HGEntities _context; public HGGameRepository(HGEntities context) { this._context = c

我处理这个问题已经有一段时间了,但似乎仍然找不到解决办法。我有几个封装EF4 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();
        }
    }
}
我有以下模块:

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();
    }
}
公共类DIModule:ninject模块
{
公共覆盖无效负载()
{
this.Bind().ToSelf();
this.Bind().To();
this.Bind().To();
this.Bind().To();
this.Bind().ToSelf();
}
}
由于我使用的是MVC2扩展,这些绑定默认为
InRequestScope()

我的问题是ObjectContext没有得到正确处理。我得到了这里描述的内容:具体来说,我得到了一个InvalidOperationException,它声明:

无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象

每次我尝试更新实体时都会发生这种情况

如果我将repos设置为bind
InSingletonScope()
,它可以工作,但这似乎是个坏主意

我做错了什么


编辑:为了清楚起见,我只想与每个请求的所有回购方共享一个ObjectContext

您必须在模块中指定
InRequestScope()
。基于此,默认设置为transient,这就是为什么您要获得多个上下文

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();
    }
}
公共类DIModule:ninject模块
{
公共覆盖无效负载()
{
this.Bind().ToSelf().InRequestScope();
this.Bind().To().InRequestScope();
this.Bind().To().InRequestScope();
this.Bind().To().InRequestScope();
this.Bind().ToSelf().InRequestScope();
}
}

另外,您是否通过nuget package manager或旧的方式将ninject添加到项目中?

使用
InSingletonScope()
没有任何危害。线程/缓存呢?老实说,我不确定在这种情况下两者是如何工作的(我来自PHP.Nuget包)。我认为MVC扩展使InRequestScope()成为默认值。我的意思是,我在NinjectWebCommon中有以下语句:DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));而且,根据intellisense的说法,InRequestScope()不是我的选择,它已经被移动到了一个不同的名称空间,您必须使用Ninject.Web.Common添加它;然后你就可以调用.InRequestScope(),我和你在哪里有相同的印象。但这是我让它工作的唯一方法。我发现一些网站展示了如何设置默认范围,但它涉及到继承内核,我不想这样做,我几乎做到了。遇到了另一个问题。如果你想看一看的话,我问了一个新问题。