Fermer

juillet 30, 2024

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

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