2011-06-03 61 views
1

这是我正面临的两个持续性问题的延续:Problems trying to attach a new EF4 entity to ObjectContext while its entity collection entities are already attachedEF4.0 - Is there a way to see what entities are attached to what ObjectContext during debugging?我正在使用此空间来询问另一个有点复杂的问题,而且我不想做出巨大的,超长的问题摆脱了我的其他线索。EF4.0,知识库和Ninject 2

因此,简要介绍:

我有一个绑定到DTO进来的表单数据。我想将DTO映射到一个实体(一个游戏实体)。起皱的是,游戏包含一个EntityCollection,我必须根据DTO中的int []创建和添加()到游戏中(每个整数代表平台的ID)。当然,EF4窒息的部分原因是它是多对多的关系,而且我认为,因为有一些诡计正在进行着多少个ObjectContext对象的发挥。我不断收到一个异常声明,我无法将检索到的Platform实体添加到我的新游戏实体中,因为它们属于两个不同的ObjectContext。根据我目前的设置,我看不出这是怎么可能的,但我不确定还有什么问题可以解决。

好的,所以我有三个存储库,我通过Ninject接口注入到我的控制器中。我在每个像这样创建ObjectContexts:

public class HGGameRepository : IGameRepository 
{ 
    private HGEntities _siteDB = new HGEntities(); 

    // rest of repo 
} 

其他两个存储库的构建方式相同。

我Ninject DI代码是相当简单:

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(); 
    } 
} 

从我读过,这应该创建这些绑定每个HTTP请求一次。

我想要做的是在所有存储库中共享一个我的HGEntities对象实例,以确保我只有一个ObjectContext参与。我只是不确定如何去做。

有没有一个标准的方法来做到这一点?

+1

我有一个与Ninject一起使用DbContext的类似问题。我必须手动部署DbContext才能完全释放底层的ObjectContext,然后才能对它执行任何操作(我甚至检查是否已将对象连接到DbContext并返回false)。不知道这是否适用于您的情况。 – 2011-06-06 20:41:52

回答

2

这里有一个选项:

更改库采取的接口,IHGEntities,在其构造和挂钩HGEntities到您的NinjectModule你与你的仓库也一样。这样,当你的控制器需要一个IArticleRepository的实例时,Ninject会实例化一个HGEntities实例以传入存储库或使用当前HTTP上下文中已经处于活动状态的实例。

然后,在您的存储库类中,您可以简单地将IHGEntities投入HGEntities。