none
MVC et Entity Framework RRS feed

  • Question

  • Bonjour tout le monde,

    J'ai fait pas mal de MVC 4 ou 5 sous VWD 2010 Express, et à ce que je me rappelle Entity Framework était fourni d'entrée de jeu dans le modèle de projet MVC.

    Sous Visual Studio 2017 Community, je vois que non, je dois taper

    Install-Package EntityFramework

    dans chaque projet.

    Y a-t-il quelque chose que j'aie manqué ?

    Par ailleurs au risque de poser une deuxième question dans le même fil, si je crée un nouveau projet avec des classes de description de données identiques, je vois qu'on recharge les mêmes données.

    ça a un côté pratique et économique, mais ça pourrait être bien de connaître les critères selon lesquels la base est choisie automatiquement, des fois que pour une raison ou une autre on ait besoin de créer une deuxième base sur le même modèle. Quelqu'un sait-il quelque chose là-dessus ?

    J'utilise LocalDb installée avec Visual Studio Community, d'ailleurs il y a un fil d'ouvert pour l'installation de Sql Server 2017.

    Versions SQL Server : 2012 Native Client - 2016 LocalDb


    • Modifié Gloops mercredi 4 avril 2018 09:30
    mercredi 4 avril 2018 09:26

Réponses

  • Bon, après la base personne, j'ai créé une application de gestion de films, et la base a été créée sans problème (sans migration, j'insiste).

    C'est donc ma deuxième question qui me rattrape : il existait déjà une base Personne, l'application essayait de l'ouvrir, et comme elle était dans un autre répertoire, n'y arrivait pas.

    Je n'ai jamais eu ce problème avec VWD 2010 Express, mais là il y a une gestion de la réutilisation des bases, qu'il faut appréhender correctement.

    Je vais marquer le fil résolu parce que j'ai situé où est le problème, mais il sera vraiment résolu quand j'aurai trouvé la doc et que je serai capable de faire des applications MVC avec des bases qui portent le même nom, sans que ça coince. Si jamais j'ai vraiment du mal à trouver la doc, au pire j'ouvrirai un autre fil.


    • Marqué comme réponse Gloops mercredi 4 avril 2018 14:01
    • Modifié Gloops mercredi 4 avril 2018 14:02
    mercredi 4 avril 2018 14:01

Toutes les réponses

  • Bonjour,

    EF était installé car l'authentification était définie par défaut (de mémoire). Depuis ASP.NET Core (+ASP.NET MVC 6), par défaut on a pas d'authentification, donc pas besoin d'EF. Si vous sélectionnez le type d'authentification "Comptes d'utilisateurs individuels" EF sera installé.

    Toutefois la logique veut que l'on est le choix du type de base de données que l'on veut utiliser, donc généralement les templates font le strict minimum et c'est ensuite à vous d'ajouter les librairies que vous voulez utiliser.

    Je ne comprends pas votre seconde question !

    Depuis VS2013 on utilise LocalDB comme base de données de développement, c'est une base sans serveur qui utilise directement le fichier de données (donc beaucoup plus légère a utiliser qu'un serveur même un Express). Donc par défaut les nouvelles base de données sont créé dans le LocalDB. Mais vous pouvez modifier vos chaîne de connexion pour utiliser un serveur SQL autre.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 4 avril 2018 09:52
  • Ah, OK.

    Mais alors si EF n'est pas installé, qui crée la base de données de l'application, en Code First ?

    D'ailleurs justement, Lundi j'ai écrit un projet MVC qui a créé sa base de données (je ne savais pas trop où, depuis j'ai vu que c'était dans App_Data), et aujourd'hui un nouveau projet créé pareil ne la crée pas.

    Alors je retourne à l'ancien projet : je renomme la base, et au lancement, pareil, erreur d'ouverture, on ne trouve pas le fichier.

    C'est nouveau, ça, Entity Framework Code First ne peut pas ouvrir la base car elle n'existe pas.

    Tout ce que je trouve comme ConnectionString dans le projet est dans web.Debug.config sous la racine :

     < add name="MyDB" 
     connectionString="Data Source=ReleaseSQLServer; Initial Catalog=MyReleaseDB; Integrated Security=True" 
     xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
    

    Il y a eu des mises à jour l'autre soir, est-ce que ça pourrait être l'origine du problème ?

    ça concernait le cloud, mais ...

    mercredi 4 avril 2018 11:08
  • EF n'est qu'une librairie qui fait le lien entre un objet .NET et une base de données (c'est un ORM). EF ne fait rien de lui-même, c'est toujours au développeur d'indiquer à EF ce qu'il doit faire avec son contexte/base de donnée.

    Le processus général en code first est le suivant:

    1. On défini notre contexte avec nos entités
    2. On indique à EF de créer une "migration"
    3. On indique à EF de construire/modifier la base de données sous-jacente.

    1 Le contexte est l'ensemble des "objets" que nous définissons et dont on veut gérer dans notre base de données. Le contexte contient tout l'ensemble de ces objets

    2 EF doit savoir comment faire le lien entre notre contexte et la base de données. Pour savoir ce qu'il doit faire avec la base de données (créer une table, modifier une colonne etc.), pour cela on créé une "migration" qui est une "étape" de modification de la base de données. Pour faire ca on utilise la commande powershell "Add-Migration" ou si c'est du dotnet core "dotnet ef migration add". Ce qui va générer le code permettant à EF construire/mettre à jour la base de données

    3 On doit indiquer à EF qu'il doit mettre à jour la base de données via les commandes "Update-Database" ou "dotnet ef database update"

    Donc c'est normal que dés la départ vos base de données ne soient pas créée, il faut créer une migration initiale, et faire une mise à jour de la base; comme elle n'existe pas EF va la créer. 

    Vous pouvez utiliser l'"explorateur d'objet SQL server" dans VS2017 pour afficher la liste des bases de données LocalDB.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 4 avril 2018 12:17
  • Je ne m'y retrouve pas, là.

    La migration n'est nécessaire que si la base existe déjà, et qu'elle n'est pas conforme au modèle fourni dans l'application.

    Bon, je vais la créer quand même, on verra bien.

    mercredi 4 avril 2018 12:23
  • Non une migration c'est le code nécessaire pour passer la base de données d'une version à une autre version. Mais il nous faut toujours une première migration qui nous fait passer d'une base "vide" à notre première version. Généralement on l'appelle la migration "initiale".

    Lorsque vous créer un nouveau site avec l'authentification, cette migration initiale est parfois déjà créée pour mettre en place les tables nécessaires à la gestion des utilisateurs/login et roles.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mercredi 4 avril 2018 12:28
  • C'est bien la première fois que je fais ça.

    J'ai commencé à étudier les migrations quand je faisais du MVC depuis un mois.

    Dès qu'on touche à la structure dans les classes, et que la base a déjà été créée, là effectivement on se fait jeter et on a droit à un lien vers la doc des migrations.

    Toujours est-il que j'ai créé une migration (qui logiquement doit être vide, donc), et que lorsque j'essaie d'afficher une vue j'ai quand même une exception :

    Exception levée : 'System.Data.DataException' dans EntityFramework.dll
    Une exception s'est produite lors de l'initialisation de la base de données. Pour plus d'informations, consultez InnerException.
    Échec du fournisseur sous-jacent sur Open.
    Cannot attach the file 'D:\Projets Visual Studio\Web\MVC006Personne\MVC006Personne\App_Data\PersonneContext.mdf' as database 'PersonneContext'.
    'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-1-131673188719445160) : Chargé 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'. Chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
    Application Insights Telemetry (unconfigured): {"name":"Microsoft.ApplicationInsights.Dev.RemoteDependency","time":"2018-04-04T12:34:45.1865543Z","tags":{"ai.internal.sdkVersion":"rddf:2.2.0-738","ai.internal.nodeName":"DESKTOP-1BFJ58P","ai.operation.id":"ZWOdrtMQVV4=","ai.location.ip":"::1","ai.cloud.roleInstance":"DESKTOP-1BFJ58P","ai.operation.name":"GET Personnes/Index","ai.operation.parentId":"ZWOdrtMQVV4="},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"(localdb)\\mssqllocaldb | master","id":"bty8KrdNoKM=","duration":"00:00:00","resultCode":"0","success":true,"type":"SQL","target":"(localdb)\\mssqllocaldb | master","properties":{"DeveloperMode":"true"}}}}
    Entre la création de la migration et l'exécution j'ai aussi tapé Update-Database, ça il ne faut pas oublier.



    • Modifié Gloops mercredi 4 avril 2018 12:44
    mercredi 4 avril 2018 12:41
  • J'ai eu un jour ce problème quand le projet contenait une chaîne de connexion non conforme, vers un type de base mal géré.

    En effaçant la chaîne de connexion la base avait été créée dans Sql Express.

    Là je suppose que dans Web.Debug.config la chaîne a été créée en même temps qu'on a tenté de créer la base, et elle paraît conforme pour une base dans LocalDb.

    mercredi 4 avril 2018 12:47
  • A propos, je dois préciser que des migrations j'en ai fait Lundi, cinq d'affilée sur la même base, donc c'est encore frais.

    J'ai écrit les classes de description, généré le projet, créé le contrôleur (MVC5 avec vues utilisant Entity Framework), puis j'ai lancé l'application, la base de données s'est créée.

    Si je me rappelle bien au premier lancement on a une erreur car le cas de la table vide n'est pas prévu par les vues créées automatiquement. J'ai ajouté ça, puis j'ai créé un enregistrement, que j'ai pu afficher, modifier ...

    Ensuite, j'ai ajouté un champ.

    Là, il a fallu que j'autorise les migrations, puis que je crée une migration initiale, et que je mette à jour la base de données.

    Enable-Migrations
    Add-Migration Initial
    Update-Database
    

    Si j'insère la gestion de profils utilisateurs c'est un petit peu plus lourd, car comme il y a deux bases il faut préciser sur laquelle je veux autoriser les migrations.

    mercredi 4 avril 2018 12:59
  • J'aurais bien essayé d'annuler la mise à jour, mais sur Windows 10, c'est le jour où on a besoin d'un point de restauration qu'on apprend que par défaut ils ne sont pas activés.

    mercredi 4 avril 2018 13:09
  • Bon, après la base personne, j'ai créé une application de gestion de films, et la base a été créée sans problème (sans migration, j'insiste).

    C'est donc ma deuxième question qui me rattrape : il existait déjà une base Personne, l'application essayait de l'ouvrir, et comme elle était dans un autre répertoire, n'y arrivait pas.

    Je n'ai jamais eu ce problème avec VWD 2010 Express, mais là il y a une gestion de la réutilisation des bases, qu'il faut appréhender correctement.

    Je vais marquer le fil résolu parce que j'ai situé où est le problème, mais il sera vraiment résolu quand j'aurai trouvé la doc et que je serai capable de faire des applications MVC avec des bases qui portent le même nom, sans que ça coince. Si jamais j'ai vraiment du mal à trouver la doc, au pire j'ouvrirai un autre fil.


    • Marqué comme réponse Gloops mercredi 4 avril 2018 14:01
    • Modifié Gloops mercredi 4 avril 2018 14:02
    mercredi 4 avril 2018 14:01