Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

"An item with the same key has already been added"

Vote:
 

This is my scenario:

I am using UnifiedSearchFor to search in content types together with a few custom types. For one of the custom types (Employee) I want to show some additional info in the search hit compared to a hit for e.g a standard content page.

To do this I have added the following conventions:

SearchClient.Instance.Conventions.UnifiedSearchRegistry
.Add();
SearchClient.Instance.Conventions
.ForInstancesOf()
.IncludeField(e => e.EmployeeMetaData());
SearchClient.Instance.Conventions.UnifiedSearchRegistry
.ForInstanceOf()
.ProjectMetaDataFrom(e => e.EmployeeMetaData());

where the extensionmethod EmployeeMetaData looks something like this:

private static IDictionary EmployeeMetaData(this Employee e)
        {                           
            var metaData = new Dictionary
            {
                {"Titel", e.Title},
                {"Telefon", e.Phone},
                {"Mobil", e.CellPhone},
                {"E-post", e.Email},
            };

            return metaData;
        }

So far so good, the UnifiedSearchHit.MetaData contains the info I want to show. However, when I call Client.Get(id) I get: "System.ArgumentException: An item with the same key has already been added". 

Stack trace:

[ArgumentException: An item with the same key has already been added.]
   System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) +52
   System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +10925834
   System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +10

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +92
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +108
   EPiServer.Find.Json.DictionaryConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) +637
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) +327
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) +1671
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) +517
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) +184
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) +791
   Newtonsoft.Json.Serialization.JsonSerializerProxy.DeserializeInternal(JsonReader reader, Type objectType) +75
   Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) +46
   EPiServer.Find.Api.SearchHitConverter.PopulateItemProperty(JsonReader reader, JsonSerializer serializer, Type objectType, Object item) +99
   EPiServer.Find.Api.SearchHitConverter.PopulateProperty(JsonReader reader, JsonSerializer serializer, Type objectType, String propertyName, Object item) +65
   EPiServer.Find.Json.IgnoredPropertiesHandlingConverterBase.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) +425
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) +791
   Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) +1144
   Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) +46
   Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader) +128
   EPiServer.Find.Api.GetCommand`1.Execute() +370
   EPiServer.Find.Client.GetWithMeta(DocumentId id, Action`1 commandAction) +329
   EPiServer.Find.Client.Get(DocumentId id, Action`1 commandAction) +56
   EPiServer.Find.Client.Get(DocumentId id) +55

Is this some bug or am I simply doing this the wrong way?

#90237
Sep 04, 2014 10:57
Vote:
 

Any particular reason you are putting the values in a dictionary? The way I see it, would it not be better to create a MetaData class and populate that instead? That would not mess up the deserialization and it would also make it a lot easier to query.

EDIT: Right, because of ProjectMetaDataFrom. I guess I should have read the entire question ;-)

#90342
Edited, Sep 08, 2014 8:48
Vote:
 

Hi,

So this is a bug then. Problem occurs when we are deserializing the dictionary and it is static like that. Meaning it is already there. We need to fail silently here then I assume.

I have added a bug for this. We will look at it as soon as possible.

/Marcus

#90352
Sep 08, 2014 9:56
Vote:
 

Ok, thanks! I forgot to mention that we are currently using version 8.0.3.411 of Find, if you need it for the bug report.

/Gustav

#90361
Sep 08, 2014 11:49
Vote:
 
An item with the same key has already been added.
I'm getting this error on my production.

the Epi find version: 13.4.3
EPiServer.ContentDeliveryApi.Search 2.18.0
EPiServer.ContentDeliveryApi 2.4.0
any idea how can I fix that on my prod?
I can't replicate that on my local


Step to reproduce:
for the replication
I added a new link to the a linkitem collection area
wait for showing the autosave
nothing happened
refresh the page
page marked as published
even after the reverting the page can't edit and publish again

2021-04-27T00:39:34,Error,wgap01mstr6sdl6prod,426871,637550807746335514,0,10896,304,"EPiServer.Find.Cms.ContentEventIndexer : An exception occurred while indexing (IContent): 20739_94395. An item with the same key has already been added.. System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) at EPiServer.ContentApi.Core.Serialization.ContentModelMapperBase.Convert(IContent content, ConverterContext converterContext) at EPiServer.ContentApi.Core.Serialization.ContentConvertingService.ConvertToContentApiModel(IContent content, ConverterContext converterContext) at EPiServer.Find.DelegateValueProvider`2.GetValue(Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at EPiServer.Find.Json.CustomWriteConverterBase.WriteNonIgnoredProperty(JsonSerializer serializer, JsonProperty property, Object propertyValue, JsonWriter writer) at EPiServer.Find.Json.CustomWriteConverterBase.WriteNonIgnoredProperties(JsonWriter writer, Object value, JsonSerializer serializer) at EPiServer.Find.Cms.Json.MaxDepthContentAreaConverter.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConvertable(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at EPiServer.Find.Api.ActionConverterBase.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConvertable(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) at EPiServer.Find.Json.Serializer.SerializeToTextWriter(JsonSerializer serializer, Object value, TextWriter textWriter) at EPiServer.Find.Json.Serializer.SerializeObjectsToJsonRequest(JsonSerializer serializer, IJsonRequest jsonRequest, IEnumerable values) at EPiServer.Find.Api.CommandBase`3.Execute() at EPiServer.Find.Client.IndexDirectly(IEnumerable objectsToIndex, Boolean deleteLanguageRoutingDuplicatesOnIndex) at EPiServer.Find.Client.Index(IEnumerable objectsToIndex, Boolean deleteLanguageRoutingDuplicatesOnIndex) at EPiServer.Find.Cms.ContentIndexer.IndexWithRetry(IContent[] contents, Int32 maxRetries, Boolean deleteLanguageRoutingDuplicatesOnIndex) at EPiServer.Find.Cms.ContentIndexer.Index(IEnumerable`1 contents, IndexOptions options) at EPiServer.Find.Cms.ContentEventIndexer.Index(IContent content, Boolean cascade, Func`2 cascadeFilter)",
#253950
Edited, Apr 27, 2021 0:50
Vote:
 

Does anyone has any idea ?

I found this link related to that issue here but it doesn't help:

 can't find  a file called LinkItemCollection.cshtml nor the mentioned line

https://support.episerver.com/hc/en-us/articles/115002345291?page=1#comment_360013502551

I'm getting error when trying to add a new link to LinkItemCollection

I searched a lot but can't find any solution, seems it's a bug or internal issue in Epi

 

here is the Epi version I'm using:

<package id="EPiServer.AddOns.Helpers" version="0.4.0.0" targetFramework="net461" />
<package id="EPiServer.Azure" version="9.4.4" targetFramework="net461" />
<package id="EPiServer.CMS" version="11.11.2" targetFramework="net462" />
<package id="EPiServer.CMS.AspNet" version="11.20.6" targetFramework="net462" />
<package id="EPiServer.CMS.CloudSynchronization" version="1.1.1" targetFramework="net462" />
<package id="EPiServer.CMS.Core" version="11.20.6" targetFramework="net462" />
<package id="EPiServer.CMS.TinyMce" version="2.4.0" targetFramework="net462" />
<package id="EPiServer.CMS.UI" version="11.27.0" targetFramework="net462" />
<package id="EPiServer.CMS.UI.Core" version="11.27.0" targetFramework="net462" />
<package id="EPiServer.ConnectForMarketingAutomation" version="5.6.0" targetFramework="net462" />
<package id="EPiServer.ContentDeliveryApi" version="2.4.0" targetFramework="net461" />
<package id="EPiServer.ContentDeliveryApi.Cms" version="2.18.0" targetFramework="net462" />
<package id="EPiServer.ContentDeliveryApi.Core" version="2.18.0" targetFramework="net462" />
<package id="EPiServer.ContentDeliveryApi.OAuth" version="2.2.0" targetFramework="net461" />
<package id="EPiServer.ContentDeliveryApi.Search" version="2.18.0" targetFramework="net462" />
<package id="EPiServer.Find" version="13.4.3" targetFramework="net462" />
<package id="EPiServer.Find.Cms" version="13.4.3" targetFramework="net462" />
<package id="EPiServer.Find.Framework" version="13.4.3" targetFramework="net462" />
<package id="EPiServer.Forms" version="4.24.3" targetFramework="net462" />
<package id="EPiServer.Forms.Core" version="4.24.3" targetFramework="net462" />
<package id="EPiServer.Forms.Samples" version="3.5.0" targetFramework="net462" />
<package id="EPiServer.Forms.UI" version="4.24.3" targetFramework="net462" />
<package id="EPiServer.Framework" version="11.20.6" targetFramework="net462" />
<package id="EPiServer.Framework.AspNet" version="11.20.6" targetFramework="net462" />
<package id="EPiServer.GoogleAnalytics" version="2.3.2" targetFramework="net462" />
<package id="EPiServer.Insight.Cms" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.Insight.UI" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.InstantTemplates" version="1.0.3-beta" targetFramework="net462" />
<package id="EPiServer.Logging.Log4Net" version="2.2.2" targetFramework="net461" />
<package id="EPiServer.Marketing.Automation.Forms" version="2.3.0" targetFramework="net462" />
<package id="EPiServer.Marketing.KPI" version="2.5.4" targetFramework="net462" />
<package id="EPiServer.Marketing.Messaging" version="1.3.0" targetFramework="net461" />
<package id="EPiServer.MarketingAutomationIntegration.Salesforce" version="4.2.1" targetFramework="net462" />
<package id="EPiServer.Packaging" version="3.4.0" targetFramework="net462" />
<package id="EPiServer.Personalization.MaxMindGeolocation" version="1.0.0" targetFramework="net461" />
<package id="EPiServer.Profiles.Client" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.Profiles.Client.Common" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.ServiceLocation.StructureMap" version="2.0.1" targetFramework="net461" />
<package id="EPiServer.TinyMCESpellChecker" version="2.0.0" targetFramework="net462" />
<package id="EPiServer.Tracking.Cms" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.Tracking.Core" version="1.7.2" targetFramework="net461" />
<package id="EPiServer.Tracking.PageView" version="1.1.0" targetFramework="net461" />
<package id="EPiServer.Turnstile.Contracts.Hmac" version="2.0.1" targetFramework="net462" />
<package id="EPiServer.VisitorGroupsCriteriaPack" version="2.0.1" targetFramework="net461" />

#256152
Jun 07, 2021 7:35
Vote:
 

To me the same thing happens to me.

I have searched for @target in my entire project and have not.
since my front is with react.

This is not the solution.


@ Html.PageLink (linkItem.Text, basePage.PageLink, new {language = basePage.LanguageBranch}, new {@target = "_blank"})

any more ideas?
#261137
Aug 26, 2021 11:04
Vote:
 

Hi Gustav,

While the bug is being resolved by optimizely is it possible to maybe refactor your solution to use a typedsearch with projections?

I believe this will not have the same issue or can be handled to fail gracefully.

Paul

#268267
Dec 11, 2021 23:07
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.