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.