Se lavorate con i content type all'interno delle vostre soluzioni di provisioning su SharePoint, vi sarà capitato di non riuscire più a cancellare un content type rimasto "orfano" dalle tante operazioni di deployment e retract che avrete fatto durante la fase di sviluppo e test.
Ho usato il termine "orfano" poichè normalmente è corretto che SharePoint ci vieti di cancellare un content type (dai site settings del nostro sito) se questo è ancora in uso, ma molto spesso può capitare che l'operazione di cancellazione venga comunque vietata anche se siete sicuri al 100% che il vostro content type non è più in uso su nessuna lista o document library (per essere sicuri, fate riferimento a questo post).
Nello specifico, il messaggio d'errore che viene visualizzato dall'interfaccia o all'interno del log di SharePoint è il seguente:
at Microsoft.SharePoint.SPContentTypeCollection.Delete(SPContentTypeId id)
at Microsoft.SharePoint.SPContentType.Delete()
at Microsoft.SharePoint.ApplicationPages.ManageContentTypePage.DeleteContentType()
at Microsoft.SharePoint.ApplicationPages.ManageContentTypePage.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Per prima cosa dobbiamo controllare se sono presenti all'interno del recycle bin una o più liste che utilizzavano il content type in questione e che magari abbiamo deciso di cancellare. Quindi, svuotiamo il cestino di SharePoint da queste liste e proviamo ad eliminare di nuovo il content type.
Se ci viene ritornato ancora l'errore descritto sopra, possiamo considerare il content type come "orfano" e possiamo procedere alla sua cancellazione. Per compiere questa operazione bisogna sporcarsi un pò le mani e modificare direttamente il database dei contenuti della vostra web application SharePoint.
Apriamo quindi SQL Management Studio, selezioniamo il database di contenuto relativo alla web application in cui abbiamo riscontrato l'errore e scegliamo di effettuare una nuova query. Questa serve per controllare la presenza effettiva del nostro content type, tramite il suo identificativo.
SELECT * FROM [NOME DATABASE].[dbo].[ContentTypes]
WHERE (sys.fn_varbintohexstr(ContentTypeId) LIKE 'VOSTRO CONTENT TYPE ID%')
Così facendo riuscirete a recuperare la riga corrispondente alla definizione del vostro content type. Da notare è il campo IsFromFeature, che sarà sicuramente valorizzato a "1".
Per risolvere quindi il problema originale di cancellazione del content type, basta settare il valore di quel campo a "0" tramite una normalissima query di update.
Update [NOME DATABASE].[dbo].[ContentTypes]
SET [IsFromFeature] = 0
WHERE (sys.fn_varbintohexstr(ContentTypeId) LIKE 'VOSTRO CONTENT TYPE ID%')
Fatto questo update, sarete così in grando di cancellare il content type orfano.
MI RACCOMANDO, utilizzate questa tecnica solo se siete sicuri al 100% che il vostro content type non ha più alcuna referenza su nessuna lista all'intenro della vostra site collection (per fare questo controllo, fate sempre riferimento a questo post).