IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Contexte commun pour 2 SGBD distincts


Sujet :

Entity Framework

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Novembre 2006
    Messages : 79
    Points : 54
    Points
    54
    Par défaut Contexte commun pour 2 SGBD distincts
    Bonjour,

    En asp.net MVC j'utilise le framework Entity pour générer mon modèle.
    Je dois me connecter à 2 SGBD Oracle (Intellect et Flexcube), pour croiser leurs données.

    J'ai donc 2 fichiers edmx correspondant aux entités des 2 bases, chacune avec son propre contexte.
    Je parviens sans difficulté à exécuter des requêtes sur des tables d'une bases à la fois.

    Mais lorsque j'essaye de croiser les données des 2 SGBD, j'ai une erreur au débuggage de l'application
    L'expression LINQ spécifiée contient des références à des requêtes qui sont associées à des contextes différents.
    Voici dans mon controlleur, la requête Linq To Entity qui croise les données des 2 SGBD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    ObjectQuery<TB_INTR_OUTGOING_DEAL> t_IntellDeals = _IntellEntities.TB_INTR_OUTGOING_DEAL;
                ObjectQuery<TB_FXFRONTOFFICE> t_IntellFrontOffice = _IntellEntities.TB_FXFRONTOFFICE;
                ObjectQuery<CSTB_CONTRACT> t_FlexCstb_contract = _FlexEntities.CSTB_CONTRACT;
                ObjectQuery<FXTB_CONTRACT_MASTER> t_FlexFxtb_contract = _FlexEntities.FXTB_CONTRACT_MASTER;
     
     
     
                ViewData.Model = (
     
                                  from intellFrontOffice in _IntellEntities.TB_FXFRONTOFFICE
     
                                  join flexCstbContract in  t_FlexCstb_contract on  intellFrontOffice.REF_NUM equals flexCstbContract.USER_REF_NO
                                  join intellOutgoingDeals in t_IntellDeals on intellFrontOffice.REF_NUM equals intellOutgoingDeals.INTELLECT_ID
                                  join flexFxtbContract in t_FlexFxtb_contract on flexCstbContract.CONTRACT_REF_NO equals flexFxtbContract.CONTRACT_REF_NO
                                  where flexCstbContract.BOOK_DATE == maDate
                                  select new IntellFlexViewModel
                                    {
                                       f_Contract_Ref_NO = flexCstbContract.CONTRACT_REF_NO,
                                       f_Book_date = flexCstbContract.BOOK_DATE,
                                       f_CounterParty = flexCstbContract.COUNTERPARTY,
                                       i_User_Ref_No = intellFrontOffice.REF_NUM,
                                       f_Sold_CCY = flexFxtbContract.SOLD_CCY,
                                        //i_Ccy_Sold = intellFrontOffice.CCY_SOLD
                                        f_Sold_Amount = flexFxtbContract.SOLD_AMOUNT,
                                        i_Amt_Sold =  intellFrontOffice.AMT_SOLD
                                    }).ToList();
    Dois-je modifier les fichiers edmx, pour ajouter l'autre contexte à la 1ere entité

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Vous faites des jointures sur des tables de deux bases en mêmes temps... manifestement ENTITIES ne le gère pas...
    Tentez de désactiver le tracking d'objet peut-ëtre?

    Sinon simulez vos requêtes avec des vues SQL interbases ...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Effectivement Entity Framework ne gère pas les requêtes entre 2 bases différentes. C'est assez logique d'ailleurs : la requête Linq étant convertie en SQL, elle ne peut pas faire plus que ce qui est faisable en SQL...

    Il est peut-être possible de contourner le problème via des DB links, mais j'ai jamais testé...

    Sinon, une autre possibilité est d'effectuer les 2 requêtes séparément et de faire la jointure localement ("in process") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var query1 = from x in db1.Table1 ...
     
    var query2 = from y in db2.Table2 ...
     
    var query = from x in query1.AsEnumerable()
                       join y in query2.AsEnumerable() on x.Colonne1 equals y.Colonne2
                       ...
    Le "AsEnumerable" fait que la requête sera traitée comme IEnumerable et non comme IQueryable, ce qui "désactive" la conversion en SQL et effectue le traitement localement (via les méthodes de la classe Enumerable)

    En fait, appeler AsEnumerable() revient à "switcher" vers Linq to Objects

  4. #4
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    elle ne peut pas faire plus que ce qui est faisable en SQL
    C'est tout a fait faisable en SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT A.col1,B.col2
    FROM BASE1.dbo.TABLEA A
       INNER JOIN BASE2.TABLEB B
          ON B.ID=A.ID
    Avec les bases sur la même instance et un user ayant les droits sur les deux bases bien entendu...

    D'où le contournement aisé via une vue sur BASE1 par exemple qui fera la requete interbase tout en la masquant la complexité au code client.

    Avec plusieurs instances il faut en effet des DBLINK...

    Sinon, une autre possibilité est d'effectuer les 2 requêtes séparément et de faire la jointure localement ("in process") :
    C'est une autre possibilité, fonction de la volumétrie evidemment.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Novembre 2006
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par iberserk Voir le message

    Avec plusieurs instances il faut en effet des DBLINK...
    C'est une autre possibilité, fonction de la volumétrie evidemment.
    Effectivement, j'ai fini par faire un dbLink entre les 2 bases issus de 2 serveurs distincts, une vue interbase et mon entité découle de cette vue. Ca marche nickel.

    Merci,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DataContext pour accès à 2 SGBD distinctes
    Par Herwin78800 dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 28/06/2011, 13h29
  2. [WD15] Fichiers HF/CS communs pour 2 applications distincte.
    Par rednight dans le forum WinDev
    Réponses: 3
    Dernier message: 28/04/2011, 13h58
  3. [Outils] pour un SGBD automatisé par douchettes
    Par PedroBD dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/02/2006, 09h39
  4. [servlet][applet] communication pour echanger des infos
    Par jeromejanson dans le forum Applets
    Réponses: 11
    Dernier message: 01/07/2005, 12h14
  5. quels langages pour quels SGBD ?
    Par njac dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 12/06/2005, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo