La valeur de la propriété chargée paresseusement n’est pas prise en charge.

Lors de la mise à niveau du CMS v11 vers la v12, nous avons rencontré une erreur indiquant « La valeur de la propriété chargée en différé n’est pas prise en charge par l’instance de propriété actuelle ». Malheureusement, la trace de la pile n’indiquait pas vraiment quel était le problème. Voici cette trace de pile :
System.InvalidOperationException: Lazy loaded property value is not supported by the current property instance at EPiServer.DataAccess.Internal.LazyPropertyValueLoader.SetValue(PropertyData property, PropertyDataRecord dataRecord, Func`3 valueConverter) at EPiServer.DataAccess.Internal.ContentDB.ReadPropertyData(PropertyData prop, DbDataReader reader, ContentReference contentLink, CultureInfo language) at EPiServer.DataAccess.Internal.ContentListDB.ReadCustomProperties(DbDataReader reader, Dictionary`2 allFetchedItems, Boolean isReadingVersions) at EPiServer.DataAccess.Internal.ContentListDB.ReadPublishedList(DbCommand cmd) at EPiServer.Data.Providers.Internal.SqlDatabaseExecutor.<>c__DisplayClass26_0`1.<Execute>b__0() at EPiServer.Data.Providers.SqlTransientErrorsRetryPolicy.Execute[TResult](Func`1 method) at EPiServer.DataAccess.Internal.ContentListDB.LoadSpecificContentInstances(IList`1 contentLinks, Int32 languageBranchID) at EPiServer.Core.Internal.DefaultContentProvider.BatchLoad(IList`1 contentLinks, Func`2 dbLoader) at EPiServer.Core.Internal.DefaultContentProvider.LoadContents(IList`1 contentReferences, ILanguageSelector selector) at EPiServer.Core.ContentProvider.GetContentBatch(IList`1 batch, ILanguageSelector selector, List`1& contents, Dictionary`2& contentMap) at EPiServer.Core.ContentProvider.GetScatteredContents(IEnumerable`1 contentLinks, ILanguageSelector selector) at EPiServer.Core.Internal.ProviderPipelineImplementation.GetItems(ContentProvider provider, IList`1 contentLinks, LoaderOptions loaderOptions) at EPiServer.Core.Internal.DefaultContentLoader.GetChildren[T](ContentReference contentLink, LoaderOptions loaderOptions, Int32 startIndex, Int32 maxRows) at EPiServer.Core.Internal.DefaultContentLoader.GetChildren[T](ContentReference contentLink, LoaderOptions loaderOptions) at MyProject.Business.Settings.SettingsService.UpdateSettings() in C:\sourcecode\MyProject.cms\src\MyProject.Business\Services\SettingsService.cs:line 185 at MyProject.Business.Settings.SettingsService.RegisterContentRoots() in C:\sourcecode\MyProject.cms\src\MyProject.Business\Services\SettingsService.cs:line 208 at MyProject.Business.Settings.SettingsService.InitializeSettings() in C:\sourcecode\MyProject.cms\src\MyProject.Business\Services\SettingsService.cs:line 142 at MyProject.Web.Middleware.Initialization.ApplicationBuilderExtensions.InitializeSettings(IApplicationBuilder app) in C:\sourcecode\MyProject.cms\src\MyProject.Web\Middleware\Initialization\ApplicationBuilderExtensions.cs:line 105 at MyProject.Web.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) in C:\sourcecode\MyProject.cms\src\MyProject.Web\Startup.cs:line 146 at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass15_0.<UseStartup>b__1(IApplicationBuilder app) at EPiServer.Forms.Samples.FormsSamplePublicStaticFileStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app) at EPiServer.Forms.FormsPublicStaticFileStartupFilter.<>c__DisplayClass1_0.<Configure>b__0(IApplicationBuilder app) at EPiServer.GoogleAnalytics.GoogleAnalyticsStaticFileStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app) at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app) at Microsoft.AspNetCore.Hosting.GenericWebHostService.<StartAsync>d__37.MoveNext()
Résoudre le problème
Optimizely CMS – l’importance des GUID et des noms d’assembly
Un collègue a découvert que lors de la mise à niveau de la v11 vers la v12, Les PropertyLists plantaient avec peu ou pas de messages d’erreur. La solution était de convertir toutes les instances de [PropertyDefinitionTypePlugIn] pour inclure un paramètre GUID avant conversion de la base de données. Effectuer cette modification puis charger le site v11 mettra à jour la base de données avec le nouveau GUID.
Vérification de la base de données
Je pensais que c’était ce que j’avais fait, mais j’avais toujours cette erreur, j’ai donc vérifié la console de débogage et trouvé une ligne qui disait :
"Unable to create a PropertyData instance of Type: 'MyProject.Data.Models.PoC.KeyValueItemProperty' Assembly: 'MyProject.Data'. Will fallback using the data type instead."
Que KeyValueItemProperty
était l’une des PropertyLists à laquelle nous avons ajouté un GUID, j’ai donc regardé dans la base de données.
SELECT * FROM [MyDatabase].[dbo].[tblPropertyDefinitionType] WHERE Name like '%KeyValueItemProperty%'
Effectivement, il y avait maintenant deux rangées pour KeyValueItemProperty
dans ce tableau. L’un d’eux avait le GUID et le plus ancien n’en avait pas.
pkID Property Name GUID TypeName AssemblyName fkContentTypeGUID DisplayName GroupName Hidden 1000 13 KeyValueItemProperty NULL MyProject.Data.Models.Properties.KeyValueItemProperty MyProject.Data NULL NULL NULL 0 1223 13 KeyValueItemProperty E05C9EF6-E538-489E-AAF4-206EB431E41B MyProject.Data.Models.Properties.KeyValueItemProperty MyProject.Data NULL NULL NULL 0
J’ai exécuté une commande UPDATE rapide pour ajouter le GUID à l’ancienne ligne, probablement celle avec le contenu associé, comme ceci :
UPDATE [MyDatabase].[dbo].[tblPropertyDefinitionType] SET [GUID] = (SELECT [GUID] FROM [MyDatabase].[dbo].[tblPropertyDefinitionType] WHERE pkID = 1223) WHERE pkID = 1000
Pour garder la base de données propre, j’ai supprimé la ligne en double :
DELETE FROM [MyDatabase].[dbo].[tblPropertyDefinitionType] WHERE pkID = 1223
J’ai essayé de lancer le site et une autre PropertyList a généré une erreur du type KeyValueItemProperty.
J’ai répété les mêmes requêtes SQL pour mettre à jour la base de données avec le GUID. Une fois cela fait, le site s’est lancé proprement.
Pour être sûr d’avoir corrigé toutes les lignes en double, j’ai exécuté la requête suivante et trouvé quelques PropertyLists supplémentaires. Apparemment, aucun contenu ne leur était encore associé, ils n’ont donc pas généré d’erreur.
SELECT * FROM [MyDatabase].[dbo].[tblPropertyDefinitionType] WHERE Name IN ( SELECT Name FROM [MyDatabase].[dbo].[tblPropertyDefinitionType] GROUP BY Name HAVING COUNT(Name) > 1)
J’ai exécuté les mêmes requêtes SQL pour les nettoyer, et j’ai maintenant un site de travail. Visual Studio ne génère plus d’erreurs concernant une valeur de propriété chargée paresseusement qui n’est pas prise en charge.
Remarque : Nous utilisons EPiServer.CMS version 12.27.1.
Veuillez partager votre point de vue sur ma solution à ce problème, si cela fonctionne ou non, ou s’il y a quelque chose que j’ai manqué. Les messages précédents du forum concernant cette erreur dataient d’avant 2018 et recommandaient d’ajouter un paramètre à web.config. j’en ai trouvé un poste cela dit, l’ajout de ce paramètre ne résolvait plus le problème.
Source link