none
MVC : histoire de versions RRS feed

  • Question

  • Bonjour tout le monde,

    Dans la vidéo Entity Framework Development Workflows, est expliqué que la démonstration est faite sous Visual Studio 2012, mais que la même manœuvre pourrait être faite sous Visual Studio 2010.

    ça m'arrange, parce que sur Windows XP SP3, pour installer VS 2012, il risque d'y avoir du sport.

    Seulement, une fois que je m'intéresse à "Code First to existing database", sur Channel 9 donc, là je suis pris d'un doute.

    Arrivé à la création du modèle, la boîte de dialogue propose quatre options dont "Code First from database". Sous MVC4 dans VS 2010, je n'ai pas ça, je n'ai que deux options : "générer à partir de la base de données", ou "modèle vide".

    Il me semble bien avoir vu quelque part il y a quelques mois un joujou qui permet d'obtenir le fichier de contexte, mais j'ai oublié où, alors j'opère en deux fois :

    1/ Exécuter cette requête sur la base et copier le résultat dans C:\listetables.txt

    (en fait dans un répertoire où l'utilisateur limité a les droits d'écriture, mais ça c'est un détail)

    SELECT TABLE_NAME
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE Table_Type='BASE TABLE'

    2/ Exécuter ce script :

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var strNomFichier = "C:\\listetables.txt";
    var strNomFRes = "C:\\context.cs";
    WScript.Echo(strNomFichier);
    ForReading = 1;
    ForWriting = 2;
    ForAppending = 8; 
    var lgf = fso.OpenTextFile(strNomFichier, ForReading, false, 0);
    var s = "using System;\r\n";
    s += "using System.Collections.Generic;\r\n";
    s += "using System.Linq;\r\n";
    s += "using System.Web;\r\n";
    s += "using System.Data.Entity;\r\n\r\n";
    s += "namespace Models\r\n";
    s += "{\r\n";
    s += "    public class Context:DbContext\r\n";
    s += "    {\r\n";
    while (! lgf.AtEndOfStream)	// enumerate the lines
    {
      	var li = lgf.ReadLine();
        s = s + "           public DbSet<" + li + "> " + li + "s {get; set;}\r\n";
    }
    s += "    }\r\n";
    s += "}\r\n";
    
    lgf.close();
    WScript.Echo(s);
    var lgf = fso.OpenTextFile(strNomFRes, ForWriting, true, 0);
    lgf.Write(s);
    lgf.close();

    Une fois que c'est fait il n'y a plus qu'à ajouter le nom du projet et le nom d'objet aux bons endroits, et mettre le fichier cible dans le répertoire Models.

    Il y aurait bien eu quelque chose à tenter pour avoir la même boîte de dialogue que dans la vidéo, c'est d'installer MVC5, mais ... pas trop bonne idée : il faut .Net 4.5, et VS 2010 ne supporte que jusqu'à 4.03

    Y a-t-il quelque chose à simplifier quelque part ?

    Ah d'ailleurs, dans Création d'une application MVC 3 avec Database First et Entity Framework 4.1, dans la section "Génération de classes d'entité fortement typées", je note

    (oups je note mal on dirait, correction plus bas, 22h35 le 7)

    6. Dans la liste filtrée de modèles d'élément, sélectionnez ADO.NET Entity Data Model.

    Ah oui, ça aurait pu simplifier, mais je n'ai que deux options :

    • ADO.Net Entity Object Generator
    • Générateur d'entités de suivi automatique ADO.Net

    Ou alors ADO.Net Entity Data Model est spécifique à MVC3, il est vrai que je ne suis pas allé voir.






    • Modifié Gloops mardi 7 octobre 2014 20:40
    lundi 6 octobre 2014 01:31

Réponses

  • Eh ben .. On n'est pas au bout, en tout cas pour MVC3.

    En revanche l'apport de MVC4 est de simplifier grandement le développement. Pour Database First :

    • au moment de créer le modèle, dans la boîte de dialogue de choix de la base de données, bien prendre note, en bas, du nom sous lequel est connu (et enregistré dans Web.config) le contexte de données.
    • générer l'application
    • au moment de créer un contrôleur, bien reporter dans la liste déroulante "contexte" le nom noté à la première étape. Bien entendu prendre garde de ne pas intervertir contexte et entité.

    C'est tout. Enfin je veux dire pour arriver jusqu'à la création de contrôleurs.

    J'ai eu l'occasion de créer un fichier de contexte comme le fait mon script ci-dessus, et c'était sous MVC4, mais ... c'était en Code First (et donc je n'ai pas lancé une requête sur la base pour avoir la liste des tables, puisque la base n'existait pas au moment de créer le fichier de contexte) :

    http://msdn.microsoft.com/en-us/data/gg685467.aspx

    Maintenant, pour revenir à MVC3, j'ai la réponse à une question posée plus haut, mal d'ailleurs, là où je parlais d'Entity Data Model. Dans la section "Génération de classes d'entité fortement typées", il n'est pas question d'Entity Data Model, mais plutôt de "ADO.NET DbContext Generator".

    Celui-là n'était pas installé sur ma machine non plus, d'ailleurs. Je suis allé chercher là une version qui se réfère à EF4 :

    http://visualstudiogallery.msdn.microsoft.com/7812b04c-db36-4817-8a84-e73c452410a2

    Mais peut-être faudra-t-il que je continue à chercher pour un plus récent, car j'obtiens systématiquement le message "unsupported context type". Mais ce qui me fait hésiter à incriminer le context generator, c'est que j'obtiens le même message avec le fichier de contexte généré avec mon script, qui a pourtant tout-à-fait la même allure que celui sur le blog de Julie Lerman.

    A propos petite curiosité : hier j'ai installé Entity Framework 6.1.1, et pourtant dans les projets MVC que je crée depuis, c'est par défaut Entity Framework 5.0.0 qui est intégré.

    Pour le moment voilà où j'en suis. MVC4 impec, mais MVC3, "infoutu moyen" de faire tourner.

    Je suppose que je dois me méfier qu'un client pourrait encore fonctionner avec MVC3 ?


    mardi 7 octobre 2014 20:31

Toutes les réponses

  • Bonjour, Gloops,

    Avez-vous essayer la deuxième option? Il me semble que "ADO.NET Entity Data Model" correspond à "Générateur d'entités de suivi automatique ADO.Net".

    Cordialement,

    Nina

    lundi 6 octobre 2014 14:10
    Modérateur
  • Avez-vous essayer la deuxième option? Il me semble que "ADO.NET Entity Data Model" correspond à "Générateur d'entités de suivi automatique ADO.Net".

    Bonjour Nina,

    ça génère effectivement des informations, dont un fichier par table, mais beaucoup plus "verbeuses" que juste un DbSet générique pour chaque table.

    Il faut bien entendu ne pas oublier de générer l'application avant de tenter de créer un contrôleur.

    Ensuite, en choisissant comme nom de contexte le nom qui a été fourni en bas de la boîte de dialogue qui a servi à choisir la base de données, j'obtiens comme réponse "type de contexte non pris en charge". Même résultat avec l'autre modèle (ADO.Net Entity Object Generator) à ce que je me rappelle.

    Je vais me rabattre sur mon script ... Qui dit mieux ?

    _________________________

    Ah mais alors il y a du nouveau. Déjà après la manœuvre dont il vient d'être question il ne suffit pas d'effacer les fichiers générés (notamment d'extension tt), car les tables (en fait les entités) ne sont plus reconnues. J'imagine que ça doit être dans le Web.config qu'il y a du nettoyage à faire, mais je ne me suis pas embêté : j'ai créé un nouveau projet.

    Et ce n'est pas fini : dans ce nouveau projet, j'ai inséré mon fichier de contexte, mais ... au moment de créer le contrôleur, j'ai choisi le même nom que tout-à-l'heure, celui donné en bas de la boîte de dialogue de sélection de la base de données. Et ça a marché. Dit autrement, j'ai mis mon fichier de contexte, mais sauf erreur de ma part je ne m'en suis pas servi.

    Je vérifie ça demain soir en ne le mettant pas.

    ________________________
    Et après, c'est le moyen d'obtenir les classes de description des tables, que je vais chercher à me remémorer. Si je ne m'abuse, on appelle ça "Code First to existing database" pour MVC5, mais en MVC4 il existe déjà un moyen.


    • Modifié Gloops lundi 6 octobre 2014 21:36
    lundi 6 octobre 2014 19:52
  • Bonjour,

    J'ai trouvé un exemple (mais en anglais) pour "Code First" en utilisant Visual Studio 2010 et MVC 4.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mardi 7 octobre 2014 07:04
    Modérateur
  • Bonjour,

    Et merci. J'ai jeté un rapide coup d'œil, en fait oui il s'agit du classique Code First tel qu'il existe en MVC 4. J'ai déjà pratiqué ça, de même que Database First. La page indiquée propose de créer un fichier Models.cs et de taper les descriptions de tables dedans, et ensuite Entity Framework se charge de créer la base de données lors de l'exécution.

    Quand on dit "Code First to existing database", en MVC 5, c'est un peu trompeur pour quelqu'un habitué aux versions précédentes de MVC : en fait, on part d'une base existante, et c'est Entity Framework qui génère les fichiers de classes, qui serviront ensuite de support à une démarche "Code First" si on veut faire des modifications de structure.

    Sous MVC 4, il me semble bien avoir obtenu ça, mais en téléchargeant un utilitaire, ou en pratiquant une astuce, je ne sais plus très bien.



    mardi 7 octobre 2014 07:53
  • Bonjour,

    Et merci. J'ai jeté un rapide coup d'œil, en fait oui il s'agit du classique Code First tel qu'il existe en MVC 4. J'ai déjà pratiqué ça, de même que Database First. La page indiquée propose de créer un fichier Models.cs et de taper les descriptions de tables dedans, et ensuite Entity Framework se charge de créer la base de données lors de l'exécution.

    Quand on dit "Code First to existing database", en MVC 5, c'est un peu trompeur pour quelqu'un habitué aux versions précédentes de MVC : en fait, on part d'une base existante, et c'est Entity Framework qui génère les fichiers de classes, qui serviront ensuite de support à une démarche "Code First" si on veut faire des modifications de structure.

    Sous MVC 4, il me semble bien avoir obtenu ça, mais en téléchargeant un utilitaire, ou en pratiquant une astuce, je ne sais plus très bien.


    Disons que je me m'apprêtais à rédiger bientôt une réponse, mais que ça n'aurait pas été celle-là. J'imagine que le sens de la marquer était de constater que c'était en bonne voie, et de ne pas avoir envie de voir des fils qui traînent sans réponse.

    Cela étant dit je reste intéressé si quelqu'un peut me rafraîchir la mémoire, quant à faire fournir les fichiers de classes, descriptifs des tables, par Entity Framework (ou un autre outil) dans le cadre de MVC4. Les vidéos en référence en tête de fil mentionnent que c'est facile sous MVC5.


    • Modifié Gloops mardi 7 octobre 2014 16:36
    mardi 7 octobre 2014 16:32
  • Eh ben .. On n'est pas au bout, en tout cas pour MVC3.

    En revanche l'apport de MVC4 est de simplifier grandement le développement. Pour Database First :

    • au moment de créer le modèle, dans la boîte de dialogue de choix de la base de données, bien prendre note, en bas, du nom sous lequel est connu (et enregistré dans Web.config) le contexte de données.
    • générer l'application
    • au moment de créer un contrôleur, bien reporter dans la liste déroulante "contexte" le nom noté à la première étape. Bien entendu prendre garde de ne pas intervertir contexte et entité.

    C'est tout. Enfin je veux dire pour arriver jusqu'à la création de contrôleurs.

    J'ai eu l'occasion de créer un fichier de contexte comme le fait mon script ci-dessus, et c'était sous MVC4, mais ... c'était en Code First (et donc je n'ai pas lancé une requête sur la base pour avoir la liste des tables, puisque la base n'existait pas au moment de créer le fichier de contexte) :

    http://msdn.microsoft.com/en-us/data/gg685467.aspx

    Maintenant, pour revenir à MVC3, j'ai la réponse à une question posée plus haut, mal d'ailleurs, là où je parlais d'Entity Data Model. Dans la section "Génération de classes d'entité fortement typées", il n'est pas question d'Entity Data Model, mais plutôt de "ADO.NET DbContext Generator".

    Celui-là n'était pas installé sur ma machine non plus, d'ailleurs. Je suis allé chercher là une version qui se réfère à EF4 :

    http://visualstudiogallery.msdn.microsoft.com/7812b04c-db36-4817-8a84-e73c452410a2

    Mais peut-être faudra-t-il que je continue à chercher pour un plus récent, car j'obtiens systématiquement le message "unsupported context type". Mais ce qui me fait hésiter à incriminer le context generator, c'est que j'obtiens le même message avec le fichier de contexte généré avec mon script, qui a pourtant tout-à-fait la même allure que celui sur le blog de Julie Lerman.

    A propos petite curiosité : hier j'ai installé Entity Framework 6.1.1, et pourtant dans les projets MVC que je crée depuis, c'est par défaut Entity Framework 5.0.0 qui est intégré.

    Pour le moment voilà où j'en suis. MVC4 impec, mais MVC3, "infoutu moyen" de faire tourner.

    Je suppose que je dois me méfier qu'un client pourrait encore fonctionner avec MVC3 ?


    mardi 7 octobre 2014 20:31
  • Bonjour,

    Pour ce qui est de MVC3 ... J'imagine que si je tombe sur un client qui utilise ça, la solution est de l'encourager à passer à MVC4 ?

    Encore que si c'est un problème d'installation, il y a des chances que chez lui ça marche. Il me reste à prier pour ne rien oublier lors du développement ...

    lundi 20 octobre 2014 14:01