1

Comment utiliser deux EDMX, dans des assemblages distincts, mais au-dessus de la même base de données,
pour créer une requête linq-to-entities qui les utilise tous les deux?EF: requête linq-to-implicite edmx (même DB)

E.g.

C'est ce que je suis en train de faire:

using (var context1 = new Entities1()) 
{ 
    using (var context2 = new Entities2()) 
    { 
     var items2 = context2.Items.Where(item2 => item2.Color == "Red"); 

     var query = context1.Items.Where(item => 
      items2.Any(item2 => item2.PainterId == item.PainterId)); 
    } 
} 

 > Il en résulte NotSupportedException. Message: "L'expression LINQ spécifiée contient des références aux requêtes associées à différents contextes."

 > Cette exception est de lancer, même si Entities2 est remplacé par entités1
    (même si les deux contextes sont de même EDMX) et à la fois en utilisant la même chaîne de connexion.



A titre de comparaison, cela sur les autres travaux manuels et les résultats dans une seule instruction SQL:

using (var context1 = new Entities1()) 
{ 
    var items2 = context2.Items.Where(item2 => item2.Color == "Red"); 

    var query = context1.Items.Where(item => 
     items2.Any(item2 => item2.PainterId == item.PainterId)); 
} 


Contraintes:

Mon intention est d'utiliser deux EDMXs AVEC le support du concepteur - pas de piratage EDMX d'une manière qui casse concepteur ou qui est écrasé lors de la mise à jour de la base de données.

EDMX # 1 ne peut pas connaître l'EDMX # 2 (cependant # 2 peut connaître # 1).

Je souhaite que le résultat soit traduit en une seule requête SQL, ne pas lire les résultats de la première partie en mémoire, puis les renvoyer à la base de données en tant qu'entrée pour la deuxième partie de la requête.



connexes, mais pas ce que je cherche:

Répondre

2

Vous avez limité vos exigences de la manière qui répond à votre question: Non, ce n'est pas possible. La meilleure et la seule solution recommandée est dans le deuxième lien qui fait référence à l'article du blog de l'équipe ADO.NET sur l'utilisation de grands modèles.

J'ai écrit environ a hack (et j'ai utilisé avec succès dans un projet) qui fonctionne aussi bien mais il a un autre inconvénient - vous devez utiliser le contexte unique pour les deux EDMX. Même cela a fonctionné, je ne recommande pas d'utiliser de cette façon, car il peut avoir des inconvénients inexplorés, car il omet en interne le nom du conteneur qui est utilisé dans de nombreux autres endroits dans EF.

+0

Je m'y attendais, il faudrait utiliser un seul contexte et je examine une approche de la fusion du EDMXs à faire, cependant, votre hack peut être plus simple. –

+0

À quoi sert le nom du conteneur en interne? –

+0

- Est utilisé pour la mise en cache des métadonnées ObjectContext, pour une création plus rapide des contextes? –

0

Un autre hack qui fonctionne, fusionnant les deux EDMX en un troisième, puis en créant un ObjectContext qui accède aux deux parties.

Les 3 EDMX devront utiliser le même espace de noms.

La fusion peut être effectuée par programme, le résultat de la fusion doit être: Fichiers EDMX, SSDL, CSDL, MSL; EDMX pour T4 et les autres pour l'intégration en tant que ressources.

Toutes les entités et associations qui se trouvent dans les deux sources EDMX doivent avoir exactement la même définition (conceptuelle et mappage).

Vous pouvez exécuter des requêtes sur le contexte EDMX fusionné qui s'exécute sur les deux EDMX source, joindre par ID ou tout autre critère.


Voir ce lien pour plus d'informations sur le câblage les résultats:
How can I create an ObjectContext from separate ssdl + csdl + msl files and no edmx?