Con risposta Update di strutture create in provisioning

  • lunedì 11 giugno 2012 13:11
     
     

    Ciao,

    stò iniziando ora a muovere i miei primi passi nel fantastico mondo del provisioning e mi sono gustato con piacere il video di Giuseppe dove ne dava una bella introduzione.

    Facendo i miei primi esperimenti però mi è sorto un dubbio:

    ma se io arrivo a definire per esempio una serie di campi custom nuovi, un content type che ne raccoglie un sottoinsieme, una list definition basata sul mio content type e anche una list istance, magari non direttamente nella list definition ma la faccio generare lato codice all'attivazione della feature che rilascia il mio provisioning, così che se sul sito dove stò facendo il deploy ne esiste già un'istanza non la sovrascrivo perdendo i dati caricati. Come faccio a questo punto, se volessi aggiungere un ulteriore campo alla mia list istance senza però perdere i dati già caricati?

    Con la feature upgrade sono riuscito a fare l'aggiunta del mio nuovo campo al content type, ma poi non riesco a propagare la modifica fino alla list istance passando per la definition!

    Dove sbaglio, c'è forse un modo migliore per modificare le strutture create in provisioning e già utilizzate in produzione, dove ho già dei dati che non posso perdere?

    grazie

    Greenhorn80

Tutte le risposte

  • mercoledì 13 giugno 2012 14:29
     
     Con risposta Contiene codice

    Ciao,

    penso che la strada che stai seguendo sia quella giusta, ma non c'é un metodo che risolve tutti i casi e tanti devi gestirli in modo custom, essendo tu consapevole della situazione nell'ambiente che stai andando ad aggiornare.

    Di base, ci sono solo 2 elementi di upgrade predisposti, che non avrebbero bisogno di essere gestiti in FeatureUpgrading:

    • ApplyElementManifests
    • AddContentTypeField

    Le azioni che non dovrebbero richiedere codice, ma richiedono ApplyElementManifests, sono:

    • provision di una nuova colonna (eccetto metadata che richiede codice comunque)
    • provision di nuovi files
    • aggiunta di elementi a una feature esistente (come un nuovo web template, una nuova web part)

    Il secondo, AddContentTypeField,  dovrebbe fare al caso tuo e risolvere la tua situazione se il tuo content type é stato creato correttamente e se la lista utilizza direttamente il tuo content type.

    Come dall'esempio a http://msdn.microsoft.com/en-us/library/ee537575.aspx

    <AddContentTypeField 
      ContentTypeId="0x010100A6F9CE1AFE2A48f0A3E6CB5BB770B0F7" 
      FieldId="{B250DCFD-9310-4e2d-85F2-BE2DA37A57D2}" 
      PushDown="TRUE" />

    PushDown="TRUE" dovrebbe appunto propagare il nuovo campo anche alla list instance

    Ti assicuri che la nuova colonna esista: devi fare il provision della nuova colonna; se hai giá una feature che si occupa di creare i fields, crea un file Elements2.xml vicino ad Elements.xml, aumenta il numero di versione della feature e usa un elemento ApplyElementManifests per Elements2.xml nella parte di upgrade della feature. Elements2.xml deve essere aggiunto anche alla feature: questo servirá se la feature verrá attivata in altri siti dopo essere giá stata aggiornata alla nuova versione.
    Il tuo script di upgrade dovrá poi aggiornare prima la feature relativa ai site fields, e poi quella relativa ai content types.

    In generale, per gli altri casi, e cercando di dare una risposta piú generica:

    Gestisci con CustomUpgradeActions e quindi da codice (FeatureUpgrading) le tue logiche di upgrade; replicando poi il codice anche in FeatureActivated nel caso la feature (giá aggiornata) venga attivata in nuovi siti.

    Hai uno script per aggiornare le features nei tuoi siti? Hai verificato che le features vengano effettivamente aggiornate?

    HTH


    Massimo Prota
    .NET MCAD - SP2007 MCTS - SP2010 MCPD and MCITP
    My blog: http://blogs.ugidotnet.org/mprota - Twitter: @massimoprota