2011-06-03 82 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。