Se siete soliti passare per il provisioning di strutture quando approcciate ad una nuova applicazione SharePoint, dovete sapere che l'inserimento di una site column di tipo lookup è una cosa su cui porre molta attenzione.
E' un'attività critica perché stiamo definendo il comportamento di una campo, senza però avere la certezza che la lista su cui fare lookup sia presente o meno all'interno del sito e dobbiamo sapere che SharePoint andrà sicuramente in errore se non troverà quella lista.

Ecco i passi per inserire un campo di tipo lookup all'interno del provisioning delle vostre strutture.
1 - Per prima cosa bisogna creare la site column e specificare:

Type="Lookup"
List="url della lista di lookup"
ShowField="il nome del campo della lista di lookup che volete visualizzare"

Ecco la sintassi che ho utilizzato io:

<Field ID="{A245781B-1656-41BB-BA0F-7D3A46B5001B}"

Type="Lookup"
Name="D4SSampleLookupField"
StaticName="D4SSampleLookupField"
DisplayName="Sample lookup field"
Group="Dev4Side"
List="Lists/Contacts"
ShowField="Title"
/>

2 - Poi bisogna creare la lista d'appoggio. In questo caso io ho utilizzato una list instance (aggiungendo anche un elemento d'esempio), ma possiamo tranquillamente scrivere il codice C# per creare la lista all'attivazione di una feature, tramite il server object model.

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<ListInstance Title="Contacts"
OnQuickLaunch="FALSE"
TemplateType="105"
Url="Lists/Contacts"
Description=""
>
<Data>
<Rows>
<Row>
<Field Name="Title">Marchi</Field>
<Field Name="FirstName">Giuseppe</Field>
<Field Name="Email">info@peppedotnet.it</Field>
</Row>
</Rows>
</Data>
</ListInstance>
</Elements>

E' indifferente se mettiamo questi due oggetti nella stessa feature, in due feature differenti, in una feature con scope=site o in una feature con scope=web. L'importante è che siano nello stesso scope e che le relative feature vengano attivate nello stesso sito.

3 - Infatti, una volta creati questi due oggetti, bisogna assicurarsi che questa lista venga creata nello stesso sito in cui verrà installata la nostra site column. Per esserne sicuri, basta che nello stesso scope in cui verrà installata la nostra site column ci sia anche la lista di lookup.

Fare il provisioning di una campo lookup

Ecco il risultato:

Fare il provisioning di una campo lookup

Se volete potete scaricare da qui i sorgenti che ho scritto per questo post:
- D4S.SP2010.Provisioning.Lookup.zip (100 kb)