Affichage des articles dont le libellé est MvcScaffolding. Afficher tous les articles
Affichage des articles dont le libellé est MvcScaffolding. Afficher tous les articles

ASP.NET MVC Scaffolding

C'est la suite de l'article : ASP.NET MVC 4 CRUD With Entiry Framework 5.0 sur l'utilisation du NuGet Packadge ASP.NET MVC Scaffolding. Je viens de tout recommencer avec Visual Studio 2013. Je sais, je suis un dangereux récidiviste ;)

Regardons si ça fonctionne encore ?

Afficher la fenêtre console de gestion des packages NuGet

C'est ici :
Affichez la console de gestion des packages NugGet

Lancer la commande d'installation de ASP.NET Scaffolding

Voici le résultat de résulat d'exécution de la commande :
PM> install-package mvcscaffolding

Chaque package vous est concédé sous licence par son propriétaire. Microsoft n’est pas responsable et n’accorde pas de licence pour les packages de sociétés tierces. Certains packages peuvent inclure des dépendances qui sont soumises à des contrats de licence supplémentaires. Suivez l’URL de la source du package (flux) pour identifier les dépendances.

Version de l’hôte de la Console du Gestionnaire de package 2.8.50926.663

Tapez « get-help NuGet » pour afficher toutes les commandes NuGet disponibles.

PM> install-package mvcscaffolding
Tentative de résolution de la dépendance « T4Scaffolding ».
Tentative de résolution de la dépendance « T4Scaffolding.Core ».
Tentative de résolution de la dépendance « EntityFramework ».
Installation de « T4Scaffolding.Core 1.0.0 ».
Installation de « T4Scaffolding.Core 1.0.0 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.Core.1.0.0\tools\init.ps1 : 50 Caractère : 30
+         Set-DefaultScaffolder <<<<  -Name CustomTemplate -Scaffolder T4Scaffolding.CustomTemplate -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.Core.1.0.0\tools\init.ps1 : 51 Caractère : 30
+         Set-DefaultScaffolder <<<<  -Name CustomScaffolder -Scaffolder T4Scaffolding.CustomScaffolder -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Installation de « T4Scaffolding 1.0.8 ».
Installation de « T4Scaffolding 1.0.8 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.1.0.8\tools\init.ps1 : 6 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name DbContext -Scaffolder T4Scaffolding.EFDbContext -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\T4Scaffolding.1.0.8\tools\init.ps1 : 7 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Repository -Scaffolder T4Scaffolding.EFRepository -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Installation de « MvcScaffolding 1.0.9 ».
Installation de « MvcScaffolding 1.0.9 » terminée.
Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 47 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Controller -Scaffolder MvcScaffolding.Controller -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 48 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Views -Scaffolder MvcScaffolding.Views -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 49 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name Action -Scaffolder MvcScaffolding.Action -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 50 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name UnitTest -Scaffolder MvcScaffolding.ActionUnitTest -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Set-DefaultScaffolder : Cannot get an instance of EnvDTE.DTE
Au niveau de E:\Visual Studio\ApplicationWeb\WebMVCApplicationKit\packages\MvcScaffolding.1.0.9\tools\init.ps1 : 54 Caractère : 22
+ Set-DefaultScaffolder <<<<  -Name View -Scaffolder $viewScaffolder -SolutionWide -DoNotOverwriteExistingSetting
    + CategoryInfo          : NotSpecified: (:) [Set-DefaultScaffolder], InvalidOperationException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.SetDefaultScaffolderCmdlet

Ajout de « T4Scaffolding.Core 1.0.0 » à WebApplicationKit.
Ajout réussi de « T4Scaffolding.Core 1.0.0 » à WebApplicationKit.
Ajout de « T4Scaffolding 1.0.8 » à WebApplicationKit.
Ajout réussi de « T4Scaffolding 1.0.8 » à WebApplicationKit.
Ajout de « MvcScaffolding 1.0.9 » à WebApplicationKit.
Ajout réussi de « MvcScaffolding 1.0.9 » à WebApplicationKit.

ASP.NET Scaffolding Installation Conclusion

C'est difficile à dire ?! On dirait que certaines choses se passent @=+}}# Grrrrrrrr
Mais d'autres plantent ... Tentons d'utiliser le package.

Utiliser le module ASP.NET Scaffolding

J'ai le modèle données suivant :
Modèle de donner à Scaffolder
Je lance donc la commande suivante :

PM>Scaffold Controller FOPBooksController –force –DBContextType “ModelContainer”

Et j'espère voir les éléments se créer mais non, ça ne fonctionne plus ....

PM> scaffold controller FOPBooksController –force –DBContextType “ModelContainer”
Invoke-Scaffolder : Impossible de trouver un paramètre positionnel acceptant l'argument « FOPBooksController ».
Au niveau de ligne : 1 Caractère : 9
+ scaffold <<<<  controller FOPBooksController –force –DBContextType “ModelContainer”
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Scaffolder], ParameterBindingException

    + FullyQualifiedErrorId : PositionalParameterNotFound,T4Scaffolding.Cmdlets.InvokeScaffolderCmdlet

MvcScaffolding 1.0.9 ne fonctionne plus

Cela ne fonctionne plus ! J'en était sûr, le module est encore là sur le site de nuget.org

https://www.nuget.org/packages/MvcScaffolding/

Mais plus rien ne fonctionne, pensez l'auteur n'a rien publié depuis Monday, October 08 2012.

Oups ! En y regardant de plus prêt si il y a MvcScaffolding 1.0.8-vs2013
...

MvcScaffolding -Version 1.0.8-vs2013 -Pre

Ben je vais essayer la commande :

PM>Install-Package MvcScaffolding -Version 1.0.8-vs2013 -Pre

Alors, mauvaise organisation du site ... perte de temps ? Certainement !?

Mais ça ne fonctionne pas mieux ! J'en était sûr des packages ne sont plus maintenus et c'est la cata. Je ne vous raconte pas comment VS s'est craché lors des multiples install uninstall de ce package. Franchement c'est pas pro, dommage.

Ne fonctionne pas non plus !

En cherchant un peu :

http://stackoverflow.com/questions/19081028/scaffolding-controllers-with-repositories-in-mvc5-ef6-visualstudio-2013

http://stackoverflow.com/questions/18727299/is-mvcscaffolding-compatible-with-vs-2013-rc-by-command-line

Plus de doute, cela ne fonctionnera plus ... snif !

Et en cherchant encore un peu plus 

J'ai exécuté la commande :
PM> Install-Package Microsoft.AspNet.Mvc.ScaffolderTemplates.AttributeRouting.CSharp

Conclusion

Le package Scaffolding est maintenant "build-in" dans le framework MVC, c'est à dire absorbé par Microsoft dans le framework.

C'est ce que l'on peut comprendre en lisant l'article suivant :

https://code.msdn.microsoft.com/MVC5-Demo-with-Entity-c6bc81df
ASP.NET MVC 5 – CRUD operations with Entity Framework 6 on Visual Studio 2013

La nouvelle commande magique se trouve maintenant (en français) dans :
Dans l'Explorateur de solutions->bouton droit sur le projet ou le dossier "Models" par exemple puis ->Ajouter->Nouvel élément structuré ...

ASP.NET MVC 4 CRUD With Entiry Framework 5.0

Comment faire un CRUD (Create Read Update Delete) avec ASP.NET MVC 4 et Entity Framework EF 5.x sous Visual Studio 2010 ?

Depuis l'avènement des NuGet packages et des autre tools qui entourent Visual Studio, sans lesquels il n'est pas possible de faire quoi que se soit, je trouve que le développement ASP.NET tient de la magie. Comme je n'ai pas froid au yeux et que je suis un peu magicien moi même, à mes heures perdues, je me lance.

J'ai trouvé ceci : ASP.NET MVC 4 – CRUD operations Entity Framework (8 steps to create your site).

Mais moi, je voudrais utiliser :

Visual Studio 2010, avec ASP.NET MVC 4, ADO Entity Framework 5.x et NuGet pour faire un CRUD (create/read/update/delete) de données structurées dans une BD SqlServer.

Est-ce que c'est possible ?

Installation de la plateforme de développement

Tout passe par la gestion des extensions et la configuration des Packages NuGet :

Gestion des Extensions
Il me faut installer deux choses :

Extensions installées par NuGet
NuGet Package Management et EF 5.x DBContext Generator for C# sont les deux extensions nécessaires à la réalisation de mon CRUD.

EF 5.x DBContext Generator for C# va me permettre de créer le modèle de données que j'utiliserai dans mon application ASP.NET MVC4.

Création de ma nouvelle Application MVC4

Après avoir installé le package MVC4 pour Visual Studio que j'ai téléchargé Ici.
Il ne me reste plus qu'à créer mon premier projet : 

Création d'une application ASP.NET MVC 4 avec Visual Studio
La structure du projet est la suivante :
Structure d'un projet ASP.NET MVC4
C'est déjà un projet assez conséquent avec déjà quelques formulaires concernant la création et la gestion des contacts et des utilisateurs de l'application ainsi que leur authentification.

Création du modèle Entity et de la base de donnée SqlServer

Il manque cruellement une base de données que je vais créer avec Entity Framework :
Création du modèle Entity Framework
Dans l'éditeur de modèle, je créé trois Entity (trois tables ou trois objets c'est la même chose) de la façon suivante :
Mon Model1.edmx
Je créé ma base de données SqlServer :

Création de la base SqlServer DataBase1.mdf
Puis je génère le script de création de la base dans l'éditeur de modèle Entity :

Génération du script de création de la base à partir du modèle
Jusque là tout va bien.

Installation de MvcScaffolding package Nuget

Je dois utiliser mvcscaffolding pour créer les objets (contrôlers) que je pourrai utiliser dans mon application ASP.NET MVC c'est là que je trouve que les choses sont un peu magiques !

Il faut taper la commande :

PM> install-package mvcscaffolding
dans la console de management des packets qui se trouvent ici :

Afficher la console PM (Package Management)

Exécution de la commande :

PM> install-package mvcscaffolding
Tentative de résolution de la dépendance « T4Scaffolding ».
Tentative de résolution de la dépendance « T4Scaffolding.Core ».
Tentative de résolution de la dépendance « EntityFramework ».
Installation de « T4Scaffolding.Core 1.0.0 » terminée.
Vous téléchargez EntityFramework à partir de Microsoft. Le contrat de licence est disponible à l’emplacement http://go.microsoft.com/fwlink/?LinkID=320539. Vérifiez si le package contient des dépendances susceptibles de faire l’objet de contrats de licence supplémentaires. Votre utilisation du package et des dépendances confirment votre acceptation de leurs contrats de licence. Si vous n’acceptez pas les contrats de licence, supprimez les composants correspondants de votre ordinateur.
Installation de « EntityFramework 6.1.0 » terminée.
Installation de « T4Scaffolding 1.0.8 » terminée.
Installation de « MvcScaffolding 1.0.9 » terminée.
Ajout réussi de « T4Scaffolding.Core 1.0.0 » à MvcApplication2.
« EntityFramework 5.0.0 » a été supprimé avec succès de MvcApplication2.
Ajout réussi de « EntityFramework 6.1.0 » à MvcApplication2.

Type 'get-help EntityFramework' to see all available Entity Framework commands.
Ajout réussi de « T4Scaffolding 1.0.8 » à MvcApplication2.
Ajout réussi de « MvcScaffolding 1.0.9 » à MvcApplication2.
Désinstallation de « EntityFramework 5.0.0 » terminée.

Utilisation du package MvcScaffolding

Mon package étant installé, je peux maintenant l'utiliser :
J'ai créé trois Entity : Compagny, Region, Departement, je vais donc lancer trois commande :

PM> scaffold controller CompagnyController –force –DBContextType “ModelContainer”
Scaffolding CompagnyController...
Added database context 'Models\ModelContainer.cs'
Added 'Compagny' to database context 'MvcApplication2.Models.ModelContainer'
Get-PrimaryKey : Error HRESULT E_FAIL has been returned from a call to a COM component.
At E:\Templates\MvcApplication2\packages\MvcScaffolding.1.0.9\tools\Controller\MvcScaffolding.Controller.ps1:71 char:29
+ $primaryKey = Get-PrimaryKey <<<<  $foundModelType.FullName -Project $Project -ErrorIfNotFound
    + CategoryInfo          : NotSpecified: (:) [Get-PrimaryKey], COMException
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.GetPrimaryKeyCmdlet

Error du package MvcScaffolding

Et là c'est la drame :

Error du package MvcScaffolding

Solution du package MvcScaffolding

Comment faire pour se sortir de ce très mauvais pas ! Voici ce que j'ai fais, c'est issu une longue longue expérience des outils et des problèmes Microsoft.

Créer le modèle EDMX au bon endroit

Je recréé le modèle .edmx dans le répertoire modèle afin que les objets générés aient le "bon namespace" car je pense que MvcScaffolding est typiquement le genre d'outil à se planter sinon ... 

Le Modèle Entity dans le répertoire Models ...
Je supprime l'ancien modèle et je créé le nouveau à partir de la BD ça fonctionne.

Modifier la génération pour obtenir des DbContext

En suite, on voit que Scaffold souhaite des objets de type DbContext c'est plus moderne. Je vais donc bouton-droit dans l'éditeur de modèle Entity pour faire :

Modèle Entity ajout d'une génération spécifique
Et je choisi :

Choix du EF DbContext Generator
Dans le fichier :
\\Templates\MvcApplication2\MvcApplication2\Models\Model1.Context.cs

public partial class DataBase1Entities : DbContext

DataDataBase1Entities ne dérive plus de ObjectContext mais de DbContext

Relancer la commande Scaffold

Comme j'ai créé la base à partir du modèle Entity mon objet Compagny s'appelle CompagnySet je lance donc la commande :
PM> scaffold controller CompagnySetController –force –DBContextType “ModelContainer”
Scaffolding CompagnySetController...
Added database context 'Models\ModelContainer.cs'
Added 'CompagnySet' to database context 'MvcApplication2.Models.ModelContainer'
Added controller Controllers\CompagnySetController.cs
Added Create view at 'Views\CompagnySet\Create.cshtml'
Added Edit view at 'Views\CompagnySet\Edit.cshtml'
Added Delete view at 'Views\CompagnySet\Delete.cshtml'
Added Details view at 'Views\CompagnySet\Details.cshtml'
Added Index view at 'Views\CompagnySet\Index.cshtml'
Added _CreateOrEdit view at 'Views\CompagnySet\_CreateOrEdit.cshtml'

Cette fois ça fonctionne et mes objets ont été correctement créés :

CRUD complet sur l'objet Compagny Créé par Entity et Scaffold
A l'exécution, j'obtiens bien la possibilité de créer affin en liste mes Compagny :

Créer une nouvelle Compagny
Formulaire de création
Liste des Compagny
Et ne trouvez-vous pas cela magique ?