Utilisation Entity Framework Core (Erreurs/Résolutions) et astuces…

En travaillant sur le projet d’architecture eShopOnWeb, j’ai rassemblé plusieurs trucs et astuces pour bien démarrer avec EF-Core/SQL. J’ai donc créé un nouveau projet API .Net Core et mis en place EF. Ce projet est disponible sur GitHub. Voici une liste d’astuces : 

  • Lorsque vous allez vouloir créer la base de données avec la commande :
dotnet ef database update 

Le message d’erreur suivant peut apparaitre :

dotnet-ef does not exist.

Pour résoudre cela, il faut s’assurer que l’outil donet-ef soit installé. Voir la documentation complète sur docs.microsoft. La commande suivante sera nécessaire.

dotnet tool install --global dotnet-ef 

  • Si lors de la commande dotnet ef database update vous avez le message suivant :

System.InvalidOperationException: Unable to resolve service for type ‘Microsoft.EntityFrameworkCore.Migrations.IMigrator’. This is often because no database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.EntityFrameworkCore.Migrations.IMigrator'. This is often because no database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider.

Cela se produit lorsque vous utilisez :

services.AddDbContext<ApplicationDbContext>(options =>
               options.UseInMemoryDatabase("MemoryDataBase"));

N’oubliez donc pas dans le Startup.cs d’utiliser un provider, exemple :

services.AddDbContext<ApplicationDbContext>(options =>
               options.UseSqlServer(
                   Configuration.GetConnectionString("DefaultConnection")));

Ici, on précise bien que l’on va utiliser SQL grâce à la méthode d’extension UseSqlServer venant du package nuget : Microsoft.EntityFrameworkCore.SqlServer.

  • No project was found. Change the current working directory or use the –project option.

Dans mon exemple, j’ai découpé le projet en suivant une architecture similaire au projet eShopOnWeb :

  • Un projet API.
  • Un projet ApplicationCore. Dans les grande lignes ce projet contiendra les entités, services et leurs interfaces,….
  • Un projet Infrastructure qui pour le moment contient le contexte EF et le répertoire Migrations
Structure du project

Si vous désirez en apprendre plus sur cette architecture, je vous invite a lire ceci

De ce fait, la commande dotnet ef database update ne sera pas suffisante. Il faudra lui préciser le projet où se trouve le contexte (-p) et également le projet startup où se trouve le point d’entrée et l’accès à la configuration(-s).

dotnet ef database update -p Infrastructure/Infrastructure.csproj -s Api/api.csproj

  • Ajouter une migration dans ce type d’architecure

Pour effectuer une migration, vous devrez également passer ces paramètres (-p, -s). En plus de cela, vous pouvez préciser le répertoire de sortie à utiliser.

dotnet ef migrations add InitialCreate -p Infrastructure/Infrastructure.csproj -s Api/api.csproj -o Data/Migrations

  • Si lors de la commande dotnet ef migrations add vous avez le message suivant:

Your startup project ‘api’ doesn’t reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.

Pour que cela fonctionne, il faut ajouter le package suivant (il faut faire cette commande dans le répertoire du projet API (projet source -p)) :

dotnet add package Microsoft.EntityFrameworkCore.Design

  • L’ensemble des commandes réalisées ici ont été faites depuis le répertoire SRC sauf la dernière puisqu’il faut se placer directement sur le projet API

Vous pouvez retrouvez plus d’informations sur EF migrations,database update,… ici.

Pour retrouver l’ensemble des commandes et paramêtres possible pour Entity Framework rendez-vous ici

Démarrer rapidement avec Blazor

Au moment d’écrire cet article, une nouvelle version de Visual Studio 2019 V16.3 vient de sortir.

Si vous désirez rapidement démarrer un projet Blazor, il vous faudra faire la mise à jour de votre Visual Studio vers cette version. Ensuite, installer l’extension Blazor de Microsoft DevLabs.

Ensuite dans les options Visual Studio autoriser l’utilisation des versions previews. Effectivement, Blazor Server a été releasé mais pas la partie client. De ce fait, le package nuget est encore en version preview. Tools=>Options=>Environment=>Preview Features et Check Use Previews…

Ensuite, n’oubliez pas de redémarrer Visual Studio. Maintenant que tout est installé, nous désirons créer un projet Blazor. Mais surtout n’utilisez pas les templates via l’interface. Apparement ceux-ci ne sont pas encore prêts, et il vous sera impossible de compiler le projet. Commencez par créer une solution vide. Ensuite, ouvrez une console. Tools=>CommandLine=>Developer Command Prompt.

Comme recommandé sur le site Microsoft utilisez la commande suivante :

dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview9.19465.2

Maintenant, nous allons pouvoir créer le projet avec la commande suivante pour un projet Blazor Client.

dotnet new blazorwasm

Maintenant, votre projet est créé, il ne vous reste plus qu’à le rajouter à votre solution. Clic droit sur votre solution Add Existing Project, choisissez le fichier .csproj. Et voilà, vous pouvez démarrer votre projet. Cette procédure fonctionne également pour Visual Studio pour Mac à la différence près que pour démarrer le projet, il vous faudra utiliser la commande dotnet run => copier l’adresse donnée dans la console et la coller dans le navigateur de votre choix.

News d’avril (Visual Studio 2019, .Net Core 3.0).

Voici quelques vidéos afin d’avoir très rapidement un aperçu sur les nouveautés concernant Visual Studio 2019 et .Net Core 3.0.

Nouvelles fonctionnalités de Visual Studio 2019 en vidéo. 🙂 

  • New Search experience

  • See content of Clipboard Ring
  • New C# refactorings
  • IntelliCode
  • Search in Autos, Locals and Watch windows
  • Document health indicator
  • Code Cleanup for C#
  • Git Stash
  • Clean Solution Load

Quoi de neuf pour .Net Core 3.0

Whats Coming with NET Core 30

Unifying Windows desktop development with .NET Core 3.0

Création d’un site ASP.NET Core (1.1) Web Application MVC à partir d’un template vide

Vous pourrez découvrir ici comment créer une application web MVC en .Net Core. Nous allons commencer l’application depuis un template vide. Ainsi vous pourrez voir comment ajouter les éléments que vous avez réellement besoin. Cela évitera d’avoir dès le début toutes les dépendances que vous n’avez pas forcément besoin.

Pour ce faire, nous allons créer un projet de type ASP.NET Core Web Application(.Net Core)

Ensuite dans le menu déroulant sélectionnez ASP.NET Core 1.1. C’est ici que nous allons sélectionner le template vide.

Votre projet est maintenant créé. Si vous allez dans l’object Startup, vous pourrez voir que l’on écrit dans Response ce que l’on désire afficher.

A ce niveau ci, vous pouvez déja lancer votre site. Et vous verrez votre Hello World. Vous venez de faire votre première application ASP.NET Core mais sans MVC.

Nous allons donc maintenant rajouter la partie MVC. Dans un premier temps, il vous faudra ajouter le package Nuget Microsoft.AspNetCore.Mvc. Pensez a bien installer la dernière version stable.

Maintenant que le nécessaire est installé, nous allons configurer dans la classe Startup l’utilisation de MVC. Il vous faudra ajouter dans la méthode Configure ceci


app.UseMvc(routes =>
{
    routes.MapRoute(
    name:"default",
    template:"{controller=Home}/{action=Index}/{id?}");
});

Esnuite dans la méthode ConfigureServices ajoutez ceci


services.AddMvc();

Dans votre projet ajoutez un répertoire Controllers. Ensuite sur votre répertoire (clic droit) ajouter un nouvel élément. Choisissez MVC Controller Class faites OK.

Votre premier controleur est ajouté. Nous allons donc créer la vue associée à ce premier controleur. Pour cela sur votre projet ajoutez un répertoire Views. Dans ce répertoire créer un sous répertoire Home qui correspond au nom du controleur. Ensuite sur votre répertoire (clic droit) ajouter un nouvel élément. Cette fois choisissez MVC View Page, garder le nom Index.cshtml.

Nous avons donc créé les éléments Controleur et Vue du design patern MVC (Modéle Vue Controleur). Donc nous allons maintenant créer la partie Modèle. Pour cela sur votre projet ajoutez le répertoire Models. Nous allons créer un simple objet (Person). Sur votre répertoire Models ajouter un nouvel élément de type Class (nom : Person).

Voici la classe Person


public class Person
{
    public int ID { get; set; }

    public string LastName { get; set; }

    public string FirstName { get; set; }
}

Nous allons donc utiliser cet objet dans le controleur pour ensuite le passer à la vue.


public class HomeController : Controller
{
    // GET: /<controller>/
    public IActionResult Index()
    {
        Person person = new Person()
        {
            ID = 1,
            LastName = "Michel",
            FirstName = "Cedric"
        };
        return View(person);
    }
}

Dans votre vue créée plus tôt (Home/Index) nous allons utiliser cet objet et l’afficher grâce au moteur de vue Razor.


@model AspNetCoreBlogTutorial.Models.Person
@{
    ViewData["Title"] = "Index";

}



<h2>
Home
</h2>





Hello @Html.DisplayFor(model => model.FirstName) @Html.DisplayFor(model => model.LastName) from our View


Lancez votre application :

Grâce à tout cela, vous venez de faire une application application Web en ASP.NET Core MVC :).

Vous pouvez trouver la solution complète sur GitHub dans la branche site-création.

Dans le prochain article, nous parlerons d’EntityFrameworkCore en Code First.

Cet article a été réalisé avec la collaboration d’Emmanuel Di Nicola

Méthode d’extension – Sérialisation Xml d’un objet en .NetStandard et .NetFramework

Voici une méthode d’extension vous permettant de sérialiser un objet en XML.

J’ai cré cette méthode d’extension dans une library de type .NetStandard. Grâce à cela, vous pourrez l’utiliser dans un projet en .NetFramework ainsi qu’en .NetCore.

Pour créer un une library en .NetStandard, créer un projet comme ceci :

Voici le code de la méthode.
public static class XmlExtension
{
    public static string Serialize<T>(this T value)
    {
        if (value == null) return string.Empty;

        var xmlSerializer = new XmlSerializer(typeof(T));

        using (var stringWriter = new StringWriter())
        {
            using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true }))
            {
                xmlSerializer.Serialize(xmlWriter, value);
                return stringWriter.ToString();
            }
        }
    }
}

Si vous créez cette méthode d’extension dans un projet de type .NetStandard, il vous faudra ajouter le package nuget suivant XmlSerializer.

XmlExtension

En .NetStandard l’objet XmlSerializer se trouve dans le Namespace System.Xml.Serialization et provient de

Or en .Net Framework celui-ci provient de 

Retrouver le code source de la version .NetStandard avec des Test Unitaires sur le GitHub.

Démarrer avec Vistual studio 2017 Community ASP.NET Core 1.1 (Préparation de l’environement)

Vous trouverez une série d’articles consacrés à la mise en place d’une application Web Mvc en ASP.NET Core. Je consacrerais 8 articles :

Dans cet article, nous démarrerons avec l’installation de Visual Studio Community 2017. Ainsi que les composants nécessaires pour la création de l’application.

Commencez par télécharger Visual Studio 2017 Communit 

Une fois télécharger, exécutez celui-ci.

Personnellement, je choisis de cocher Universal Windows Platform development et .NET desktop development car je sais que plus tard j’en aurais besoin. Par contre n’oubliez surtout pas ASP.NET and web development.

Et également .NET Core cross-platform development

Ensuite dans le deuxième onglet (Individual components) allez cocher Git for Windows et GitHub extension for windows. Vous aurez besoin de ces extensions si vous désirez récupérer le code pour les prochains articles. Le second article d’ailleurs sera consacré à la prise en main de l’extension GitHub pour Visual Studio.

 

 

 

 

 

 

 

 

 

Une fois l’installation terminée lancez Visual Studio dans le menu choississez Tools –> Extensions and updates…

Là vous pourrez voir qu’une mise à jour est disponible. Il s’agit de l’extension GitHub. Faites la mise à jour. 

Ensuite, nous allons installer une extension indispensable pour le développement Web. Il s’agit de l’extension Web Essentials 2017. Vous trouverez tous les détails ici.

Pour cela cliquez sur online dans la partie de droite, ensuite dans la zone de recherche en haut à droite tapez web. Vous trouverez Web Essentials cliquez sur Download.

Maintenant cliquez sur le bouton Close et fermer Visual Studio. L’installation de l’extension va se lancer.

 

 

 

 

 

 

 

 

Une fois cela terminé re-ouvrez Visual Studio, là une série de composants vont s’installer.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Après cette étape, il vous faudra encore redémarrer une fois votre Visual Studio.

Suite : Utilisation de l’extension GitHub pour Visual Studio 2017 Community

Utiliser une library .NET depuis un site en ASP classic

Pour utiliser une library .Net depuis une page ASP, il vous faudra passer par un composant COM.

Pour cela, créer une application de type library tout à fait normal.

createproject

Cependant, il faudra que l’objet que vous allez exposer ait un constructeur par défaut sans paramètre. Cette obligation vient du fait qu’en ASP, il est impossible de passer des paramètres dans l’instanciation de l’objet.

<% dim client client=Server.CreateObject("TestDllAsp.Client") %>

Ensuite dans cet objet ajoutez les méthodes que vous désirez.

Exemple :

namespace TestDllAsp
{

    public class Client
    {
        public Client()
        {

        }

        public int GetData()
        {
            return 3;
        }
    }

}

Si besoin, vous pouvez sans problème ajouter des références vers d’autres librairies de votre choix. Même si celles-ci ne sont pas du type COM.

Par contre votre librairie devant être du type COM, il vous faudra aller dans les propriétés de votre projet –> Application –> Assembly information et cocher la case (Make assembly COM-Visible).

com-visible

Ensuite, vous devrez signer votre DLL sinon vous ne pourrez pas l’enregistrer en tant que COM avec regasm. Pour cela dans les propriétés cochez Signe the Assembly dans la liste déroulante sélectionnez –> new –> donnez un nom –> puis décocher la demande de mot de passe.

sign

 

Compilez ensuite votre DLL. Allez dans le répertoire BIN/Realease et copiez tous les fichiers *.DLL. Placez-les ensuite sur votre serveur. (exemple : c:/DeployPackage).

Si vous utilisez des librairies externes, ces DLL ne sont pas forcément COM-Visible. Pour ces DLL, il faudra les enregistrer dans le GAC, pour cela j’utilise GacUtil.

Pour disposer de gacutil, vous pouvez l’installer via ce package : SDK Tools

Ou alors allez dans le répertoire  %programfiles%\Microsoft SDKs\Windows\vx.0A\ (x dependant de la version du framework) copier les fichiers (gacutil.exe, gacutil.exe.config et également 1033/gacutlrc.ddl). Placez les dans un répertoire (exemple : c:/DeployPackage) sur le serveur. Maintenant vous pouvez utiliser gacutil pour enregistrer les DLL dans le GAC.

Source : Récupérer gacutil

Pour enregistrer les DLL non COM dans le GAC utilisez la commande suivante (en admin) :


gacutil /i "C:\DeployPackage\nomDeLaLibrary.dll"

Ensuite, il faudra enregistrer la ou les DLL COM avec RegAsm (en admin).


c:

cd\

cd windows\Microsoft.NET\Framework\V4.0.30319\

regasm /tlb c:\DeployPackage\TestDllAsp.dll /codebase

Ensuite, il faut lancer le Component service: How To

Ensuite allez dans Component Services –> Computers –> My Computer –> COM+ Applications. Faites un clic droit puis NEW –> Application.component

 

Next

Create an empty application

Donnez un nom et choississez le type  library Application.

componentname

 

 

 

 

 

 

 

 

 

 

Next –> Finish

Une fois l’application créée, nous allons ajouter un composant.

Pour ce faire, faites un clic droit sur le sous-répertoire Components de votre application.

 

addcom

 

 

 

 

 

 

 

 

 

 

 

Choississez l’importation de composant déja enregistré.

add-conpononent

 

 

 

 

 

 

 

 

 

Cochez 32 bit registry. Vous trouverez dans la liste, la library installée précédemment.

add

 

 

 

 

 

 

 

 

 

Une fois votre composant ajouté, il faut autoriser IIS à les utiliser.

Pour cela faites un clic droit sur le composant puis allez dans l’onglet Properties puis cochez Allow IIS intrinsic properties

properties

 

 

 

 

 

 

 

 

 

 

 

 

Il faut également que votre application pool de votre application ASP soit compatible 32 bit pour cela dans les settings de votre application pool activé celui-ci.

32-bit-iis

 

 

 

 

 

 

 

 

 

 

 

 

Vous pouvez maintenant dans une page ASP instancier un objet et l’utiliser.

dim client 
client=Server.CreateObject("TestDllAsp.Client");
dim result
result = client.GetData();

Cet article a été réalisé avec la collaboration de Fabrice Sacré