【问题标题】:EF4.0, repositories, and Ninject 2EF4.0、存储库和 Ninject 2
【发布时间】:2011-06-07 04:43:08
【问题描述】:

这是我面临的两个持续存在的问题的延续: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? 我正在利用这个空间提出另一个有点复杂的问题,我不想提出一个巨大的、超长的问题在我的其他线程之外。

所以,简要介绍一下:

我有绑定到 DTO 的传入表单数据。我想将 DTO 映射到实体(游戏实体)。问题是游戏包含一个 EntityCollection,我必须根据 DTO 中的 int[] 创建并 Add() 到游戏中(每个整数代表平台的 ID)。当然,EF4 令人窒息的部分原因是它是多对多的关系,但我认为,还有一些关于有多少 ObjectContext 对象在起作用的恶作剧。我不断收到一个异常,声称我无法将检索到的平台实体添加到我的新游戏实体中,因为它们属于两个不同的 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 可以使用。我只是不确定该怎么做。

有标准的方法吗?

【问题讨论】:

  • 我在使用带有 Ninject 的 DbContext 时遇到了类似的问题。我必须手动处理 DbContext 以完全释放底层 ObjectContext,然后才能对其进行任何操作(我什至检查对象是否已附加到 DbContext 并且它返回 false)。不过,不确定这是否适用于您的场景。

标签: c# entity-framework-4 ninject ninject-2


【解决方案1】:

这是一种选择:

更改您的存储库以在其构造函数中接收接口 IHGEntities,并将 HGEntities 连接到您的 NinjectModule 中,就像您对存储库所做的那样。这样,当您的控制器需要 IArticleRepository 的实例时,Ninject 将实例化 HGEntities 的实例以传递到存储库或使用在当前 HTTP 上下文中已经处于活动状态的实例。

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

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2016-02-05
    • 2011-05-21
    • 2011-11-06
    • 2011-03-09
    • 2019-11-21
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多