这是我面临的两个持续存在的问题的延续:Problems trying to attach a new EF4 entity to ObjectContext while its entity collection entities are already attached和EF4.0 - Is there a way to see what entities are attached to what ObjectContext during debugging?我正在利用这个空间提出另一个有点复杂的问题,我不想做出巨大的问题我的其他话题中的超长问题。
所以,快速破解:
我有来自DTO的传入表单数据。我想将DTO映射到实体(游戏实体)。皱纹是游戏包含一个我必须创建的EntityCollection和基于DTO中int []的Game()(每个整数代表一个平台的ID)。而且,自然而然,EF4窒息的部分原因在于它是一种多对多的关系,而且我认为,因为有一些恶作剧正在发生着多少ObjectContext对象。我不断声称我无法将检索到的平台实体添加到我的新游戏实体,因为它们属于两个不同的ObjectContexts。鉴于我目前的设置,我看不出这是怎么可能的,但我不确定问题还有什么。
好的,所以我有三个存储库,我通过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在运行。我只是不确定该怎么做。
有没有一种标准方法可以做到这一点?
答案 0 :(得分:2)
这是一个选项:
更改您的存储库以在其构造函数中接受IHGEntities接口,并将HGEntities与您的存储库相同地连接到NinjectModule。这样,当您的控制器需要IArticleRepository的实例时,Ninject将实例化HGEntities的实例以传递到存储库或使用当前HTTP上下文中已处于活动状态的实例。
然后,在您的存储库类中,您可以简单地将IHGEntities转换为HGEntities。