In questi giorni mi sono imbattutto in un problema che riguarda la scrittura di valori in un field di tipo lookup multi value. Per la precisione: ciò che veniva fatto è valorizzare la collezione del multi value un pò alla volta senza ogni volta salvare l'item, più o meno come riportato
SPListItem item = getItem();
//Code 1
SPFieldLookupValueCollection fieldLookupValues = (SPFieldLookupValueCollection)item["MultiValueField"]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(1, "value));
item["MultiValueField"] = fieldLookupValues;
//... do some operations
//Code 2
fieldLookupValues = (SPFieldLookupValueCollection)item["MultiValueField"]; // Exception
Nel primo blocco di codice viene letto un field, settato il primo valore della collection e successivamente salvata la collection sul item.
Il secondo blocco, se seguito successivamente al primo, genera una exception di tipo 'Unable to cast object'. Questo perchè è l'oggetto SPListItem che si occupa di mappare la stringa di un lookup multi value, il cui valore è id1;#value1;id2;#value2, in un oggetto di tipo SPFieldLookupValueCollection. Una volta impostato un valore per questo campo, il type del field torna ad essere String, ovvero il tipo con cui viene internamente gestisto.
Per farlo tornare un oggetto tipizzato a SPFieldLookupValueColletion occorre fare un item.Update() prima del blocco 2.