ASP.Net Core 2.1 avec Entity Framework Core 3.1

.NET Core devient de plus en plus populaire. Mais si comme moi vous travaillez avec des dépendances incompatibles, alors vous êtes contraint de continuer d'utiliser .NET Framework pour encore un bon moment. Heureusement, la plupart des composants ciblent .NET Standard, donc nous pouvons à avoir un avant goût. Notamment avec le nouveau framework Web ASP.NET Core et le nouveau ORM Entity Framework Core. Seulement ils ne semblent pas faire bon ménage ensemble.

Une base solide est préférable avant d'ajouter d'autres éléments
Une base solide est préférable avant d'ajouter d'autres éléments
Entity Framework Core 3.1 est la dernière version compatible avec .NET Framework. Quand à ASP.NET Core, la version 2.2 est compatible avec .NET Framework, seulement le support a pris fin le 23 décembre 2019. Quand au support ASP.NET Core 2.1, il prendra fin le samedi 21 août 2021 pour .NET Core. Par contre, il sera maintenue pour .NET Framework.

Lorsque l'on tente d'intégrer Entity Framework Core en version 3.1 à un projet ASP.NET Core 2.1, l'erreur suivante survient au démarrage :

System.MethodAccessException:
Attempt by method 'Microsoft.Extensions.Logging.Configuration.LoggerProviderConfigurationFactory.GetConfiguration(System.Type)' to access method 'Microsoft.Extensions.Logging.ProviderAliasUtilities.GetAlias(System.Type)' failed.
at Microsoft.Extensions.Logging.Configuration.LoggerProviderConfigurationFactory.GetConfiguration(Type providerType)
at Microsoft.Extensions.Logging.Configuration.LoggerProviderConfiguration`1..ctor(ILoggerProviderConfigurationFactory providerConfigurationFactory)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
...
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at WebApplication11.Program.Main(String[] args)

Pour reproduire cette erreur, c'est plutôt simple. Dans un premier temps, il faut créer un projet de type ASP.NET Core ciblant .NET Framework.

> dotnet new web --name WebDemo --target-framework-override net48
> cd WebDemo

Ensuite, il faut ajouter le package NuGet Microsoft.EntityFrameworkCore en version 3.1.18:

> dotnet add package Microsoft.EntityFrameworkCore --version 3.1.18

Finalement, il suffit de démarrer l'application Web pour révéler l'erreur :

> dotnet run

System.MethodAccessException:
Attempt by method 'Microsoft.Extensions.Logging.Configuration.LoggerProviderConfigurationFactory.GetConfiguration(System.Type)' to access method 'Microsoft.Extensions.Logging.ProviderAliasUtilities.GetAlias(System.Type)' failed.
...

Il semble que WebHost ne parvienne pas à charger la configuration du logging. Pour comprendre le problème, voici les dépendances d'ASP.NET Core et d'Entity Framework qui entre en jeu :

La dépendance Microsoft.Extensions.Logging est présent dans l'arbre de dépendance avec deux versions différentes. Comme le projet ne spécifie pas explicitement une version, alors c'est la version la plus élevée qui sera utilisée. Donc le projet Web aura les dépendances suivantes :

Si on se référe au message d'erreur, on constate que le problème vient du package Microsoft.Extensions.Logging.Configuration qui utilise la méthode ProviderAliasUtilities.GetAlias du package Microsoft.Extensions.Logging. Seulement, cette méthode était qui était présente dans la version 2.* du package Microsoft.Extensions.Logging a été retirée à partir de la version 3.* du package Microsoft.Extensions.Logging pour être intégré directement à Microsoft.Extensions.Logging.Configuration par l'intermédiaire de sources partagées.

Pour cette raison, Microsoft.Extensions.Logging.Configuration en version 2.* n'est pas compatible avec Microsoft.Extensions.Logging en version 3.*, contrairement à ce qu'indique les informations NuGet du package :

Pour résoudre l'erreur, il faut ajouter au projet explicitement la dépendance en version 3.* du package Microsoft.Extensions.Logging.Configuration :

> dotnet add package Microsoft.Extensions.Logging.Configuration --version 3.1.18

Dependency hell is a colloquial term for the frustration of some software users who have installed software packages which have dependencies on specific versions of other software packages.


L'enfer des dépendances est un terme familier pour désigner la frustration de certains utilisateurs de logiciels qui ont installé des logiciels qui ont des dépendances sur des versions spécifiques d'autres logiciels.