none
WCF et entity frameworl return value RRS feed

  • Question

  • bonjour,

    je vais être très désagréable!

    Voilà,

    j'ai des web sercices WCF qui sont reliés à une base de donnéees, avec EF4

    j'ai des web sercices qui retournent des valeurs "intrinsèques" tels que GetVersion qui retourne une string

    pour tester les WS j'ai inséré un projet test en Silverlight 4 ( je l'avais déjà fait avec winform), en référant les services

    Avec les web services "intrinsèques" pas de problèmes j'obtiens bien les réponses

    Par contre avec les données émmanants de la base de données au travers de EF4 ça ne fonctionne pas, je passe sur les détails des messages du style "ne supporte pas le protocole machin ...)

    Franchement, y a marre : soit que votre systeme est buggé ou que le code généré n'est pas correct, mais là il faut faire quelque chose !

    Dans les version précédentes ça fonctionnait correctement.

    P.Guerin

    samedi 4 septembre 2010 16:52

Toutes les réponses

  • Bonjour Pgn,

    Je comprend votre envie de urler, mais il faut comprendre WCF et Ef pour assimiler ce qui se passe maintenant ;)

    EF est très sympa pour faire des choses en local avec Linq, on a de nombreux points qui sont optimiser pour minimiser nos aller-retour avec les bases de données. Patr contre affin que ceci fontionne correctement, certaines opération sont "retardées". Elles n'ont lieu qu'au moment de l'appel de la ressources.

    Avec WCF c'est tout le contraire. exposer des données ou des informations via WCF signifie exposer un élément entièrement à un instant.

    Par exemple si on fait une méthode WCF qui expose des entités provenant d'une requête sur Ef il est impératif de faire un retour sur un tabeau ou une liste et d'avoir fait un petit ToArray() ou ToList() sur ses donnée. On s'assure alors de sortir du context EF et d'avoir consommer ses données.

    On ne le vois pas imédiatement, mais il en est de même pour quasiement tout EF quand on veut l'utiliser via WCF (c'est un peu le pourquoi d'ADO .net Entity servicies).

    Si vous voulez utiliser EF via WCF et maitriser ses opérations vous devrez certainement regarder les concepts POCO et EF WCF ;)


    Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)
    lundi 6 septembre 2010 07:51
    Modérateur
  • Bonjour Jérémy,

    Merci pour votre réponse.

    Oui j'hurle, c'est pas possible de promouvoir une techno qui ____.

    Je fais bien les ToArray() ou ToList(), ça change rien : La sérialisation ne fonctionne pas.

    Bon utiliser POCO pourquoi pas, ça revient à encapsuler tout le code et prendre le risque d'utiliser encore une techno emmergente. J'ai pris une autre direction : développer mes customs class et mes datacontract. C'était prévu dans le projet d'avoir des class métiers. Mais être obligé d'encapsuler les entités de base là ( comme les tables de références dans la base par ex) ça me fait particulièrement Ch..

    Pour la petite histoire, au début du projet  j'avais utilisé Ria (je trouvais ça génial) résultat j'ai essuyé les plâtres et j'ai du aussi revenir en arrière: donc même combat.

    En conclusion, avec WCF il faut rester dans le classique le plus absolu.

    Là j'ai une sacré dent envers Microsoft et pourtant ça fait plus de 20 ans que j'utilise leurs outils de dev :)

    Bon ça met du piment, mais le projet prend du retard - ça c'est moins drôle !

    Patrick

    lundi 6 septembre 2010 08:16
  • Bonjour Pgn,

     

    Je parlais de POCO en termes d'approche ;) (et je vous rassure, ce n'est pas tout jeune comme idée)

     

    L'exemple que j'ai voulu donnée avec Array et List était juste pour présenter une chose dont on se méfie que trop peu avec EF (j'en ai fait les fraits aux débuts avec Linq to SQL). Cet exemepl était juste pour évoquer le fait que l’on consomme via WCF des données déjà consommée côté serveur.

    Un souci qui se présente trop souvent c’est de croire que la nouvelle techno pose problème. Cela semble être votre cas… et là encore, moi aussi j’avais cette même dent contre MS et ses nouveautés qui nous gâchent la vie. En fait le souci vien du fait que l’on oublie totalement les contraintes de WCF.

    Je vous conseille donc vivement de vérifier que ce que vous appelé est bien déjà consommé côté serveur. Par exemple EF n’y serra pour rien si vous consommer des entités via WCF et que vous voulez lancer une méthode de l’un de ces objets… ce ne sera pourtant pas forcement possible car l’objet n’étant plus attaché à son context, il ne peut plus l’utiliser.

    Je voulais juste vous présenter une orientation possibilité pour débugger vos projets WCF+EF.

     

    PS : quand j’ai préparé ma certification WCF4 j’ai été pas mal confronté à l’étude de ce genre de cas et cela m’a beaucoup appris.

    REPS : o que je n’aime pas RIA, c’est sexy mais quand on veut maitriser ses services cela devient l’usine à gaz L


    Jérémy Jeanson MCP, MCTS http://blogs.codes-sources.com/JeremyJeanson/ (French or English spoken)
    lundi 6 septembre 2010 08:30
    Modérateur
  • re bonjour,

    le plus simple c'est peut être un exemple de code assez basic: retourne une liste à partir d'un nom

     

     

    public List<Community> GetCommunityByName(string name) // Community est une table dans la base

    {

     

     

    ViaSaasEntities entities = ConnectionServices.GetEntitiesAccess(); // accède à EF

     

     

    var query = from community in entities.Community where (community.Name == name) select community;

     

     

    if (query.Count<Community>() == 0) return null;

     

     

    return new List<Community>(query.ToList<Community>());

    }

    Ce code fonctionne correctement et le query est "rempli", par contre du coté client : NADA :)

    c'est donc bien la sérialisation qui fonctionne pas.

    Patrick

    lundi 6 septembre 2010 08:54