2011-06-03 3 views
1

Ceci est dans la continuité de deux problèmes en cours auxquels je suis confronté: Problems trying to attach a new EF4 entity to ObjectContext while its entity collection entities are already attached et EF4.0 - Is there a way to see what entities are attached to what ObjectContext during debugging? J'utilise cet espace pour poser une autre question un peu compliquée, et je ne veux pas faire un énorme, question très longue sur mes autres fils.EF4.0, référentiels, et Ninject 2

Ainsi, un rapide aperçu:

J'ai données sous forme d'entrée qui est lié à un DTO. Je veux mapper le DTO à une entité (une entité de jeu). La ride est que le jeu contient un EntityCollection que je dois créer et ajouter() au jeu basé sur un int [] dans le DTO (chaque entier représente l'identification d'une plate-forme). Et, naturellement, EF4 étouffe en partie parce que c'est une relation many-to-many, mais aussi, je pense, parce qu'il y a des manigances qui se passent avec combien d'objets ObjectContext sont en jeu. Je reçois toujours une exception en affirmant que je ne peux pas ajouter mes entités Platform récupérées à ma nouvelle entité Game car elles appartiennent à deux ObjectContexts différents. Je ne vois pas comment cela est possible étant donné ma configuration actuelle, mais je ne suis pas sûr de ce que pourrait être le problème. Ok, donc j'ai trois dépôts que j'injecte dans mon contrôleur via l'injection d'interface Ninject. Je crée les ObjectContexts dans chaque comme ceci:

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

    // rest of repo 
} 

Les deux autres référentiels sont construits de la même façon.

Code Mon Ninject DI est assez simple:

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

D'après ce que j'ai lu, cela devrait créer ces liaisons une fois par requête HTTP.

Ce que je voudrais faire est d'avoir une instance de mon objet HGEntities être partagée entre tous les dépôts afin de s'assurer que j'ai un seul ObjectContext en jeu. Je ne suis pas sûr de savoir comment le faire.

Existe-t-il un moyen standard de le faire?

+1

J'ai eu un problème similaire en utilisant un DbContext avec Ninject. Je devais disposer le DbContext, manuellement, pour libérer complètement le ObjectContext sous-jacent avant de pouvoir faire quoi que ce soit (je vérifiais même si les objets étaient déjà attachés au DbContext et qu'il renvoyait false). Je ne sais pas si cela s'applique dans votre scénario, cependant. –

Répondre

2

est ici une option:

Changer vos dépôts à prendre dans une interface, IHGEntities, dans leur constructeur et brancher HGEntities dans votre NinjectModule même vous avez fait avec vos dépôts. Ainsi, lorsque vos contrôleurs ont besoin d'une instance de IArticleRepository, Ninject instanciera une instance de HGEntities pour la transmettre dans les référentiels ou utilisera l'instance déjà active dans le contexte HTTP actuel. Puis, à l'intérieur de vos classes de référentiel, vous pouvez simplement convertir IHGEntities en HGEntities.