Mettre à jour l’application Asp.net vers Npgsql 3 et supprimer Preload Reader

J’ai mis à jour mon application ASP.NET de NpgSQL 2.2.5 à 3.0.1. Dans les dernières modifications, il est spécifié qu’ils ont supprimé la prise en charge de Preload Reader . Donc, je le supprime de la connexion de chaîne. En testant mon application Web, j’ai eu l’erreur “Une opération est déjà en cours.” spécialement dans la requête linq comme ceci:

var plugins = from p in _pluginRepository.GetPlugins() // this method return this: GetAll().OrderBy(p => p.Created) join e in _userPluginRepository.GetByUserId(user.Id).ToList() on p.Id equals e.Plugin.Id into pe from e in pe.DefaultIfEmpty() select new PluginViewModel { Active = e != null, Name = p.Translations.ToUserLanguage(loggedInUser), Key = p.Key, PluginId = p.Id, SettingId = e == null ? 0 : e.Id, ExpireDate = e != null && e.ExpireDate.HasValue ? e.ExpireDate.Value : (DateTime?) null, Grants = e == null ? UserPluginGrants.None.GetHashCode().ToSsortingng() : e.Grants.GetHashCode().ToSsortingng() }; 

Pour résoudre cette erreur, je dois append une liste de tâches après la méthode GetPlugins . Est-ce le comportement correct à utiliser sans Preload Reader ? Pourquoi?

Dans Npgsql 2.x, à l’aide du lecteur de précharge, Npgsql a extrait l’ensemble des résultats de la requête de la firebase database dans la mémoire de votre application. Cela libère la connexion et permet à une autre commande d’être exécutée tout en parcourant l’ensemble de résultats de la première requête. En d’autres termes, cela vous permettait de programmer comme si vous pouviez exécuter plusieurs requêtes simultanément (parfois appelées MARS), bien que cela se fasse en coulisse de manière inefficace.

L’ajout d’un ToList () fait exactement la même chose: tout en mémoire dans la mémoire du client, seulement dans le code de votre application plutôt que dans le pilote de la firebase database. C’est donc un moyen acceptable de porter votre application de Npgsql 2.x à 3.x.

Désormais, si le jeu de résultats en cours d’extraction (dans ce cas, GetPlugins) est petit, il s’agit d’une approche parfaitement valide. Si c’est gros, vous devriez cependant chercher des alternatives. Dans votre exemple, la jointure pourrait être envoyée à la firebase database, ce qui aurait pour effet de traduire votre expression Linq en une requête SQL unique et d’éliminer le besoin de recourir à plusieurs requêtes (les ORM tels qu’Entity Framework peuvent généralement le faire pour vous). Une solution plus extrême consisterait à utiliser plusieurs connexions à une firebase database, mais cela est plus lourd et pose également problème si vous utilisez des transactions.

Notez qu’il existe un problème en ce qui concerne l’implémentation du véritable MARS dans Npgsql (même s’il est peu probable qu’il le soit aussi): https://github.com/npgsql/npgsql/issues/462