2009-01-15 81 views
9

我有一種假設的問題(至少現在:))Sharepoint:內容類型更新時,基於內容類型的列表會發生什麼變化?

比方說,我創建基於一些自定義內容類型的列表。我在該列表中添加了大約1000個項目(在生產中)。然後客戶來了,他說他需要修改該自定義內容類型。

如果我修改自定義內容類型,列表會發生什麼?它會自動更新(我懷疑)?那麼已經創建的列表項呢?

你們有沒有這方面的經驗?

回答

16

所以一對夫婦的有關內容類型的問題:

首先,內容類型有兩種形式:網站內容類型和列表內容類型。網站內容類型是駐留在圖庫中的「模板」。在列表中使用站點內容類型時,內容類型將在給定列表中實例化爲列表內容類型。其次,您的內容類型可以通過多種方式創建和修改,這將決定您的數據在數據庫中存在三種模式。

如果您已經使用GUI或通過使用API​​的自定義代碼創建了內容類型,則您的網站內容類型和列表內容類型在數據庫中處於「僅數據庫」狀態。這意味着它正在數據庫中查找內容類型的定義。

如果您已經創建了內容類型爲特徵的CAML,您網站內容類型幻像(或取消定製爲我們應該調用它V3)在數據庫中。這基本上意味着數據庫在構建內容類型的站點列的12-hive中的功能XML中查找。所以這應該意味着你可以更新該功能,並且你可以在更新內容類型中使用新的網站列,對吧?

不幸的是:請記住,我們也有列表內容類型?這裏令人失望的是,這些列表內容類型是使用代碼實例化的,因此它們處於「僅數據庫」狀態。這意味着您的更改只能在您的網站內容類型中看到,而不能在使用該內容類型的現有列表中看到!

解決此問題有幾種方法,解決方案取決於您的需求以及您正在做什麼樣的更改(刪除字段,添加字段,更改字段)。

例如,即使內容類型隨時間變化,您通常仍希望保留現有的元數據數據。如果您通過代碼瀏覽列表內容類型的更改,則會丟失存儲在已更改/已刪除字段中的數據。解決這個問題的方法是根據舊的內容類型添加一個全新的內容類型,但需要更改字段。您可以添加新的內容類型(通過代碼或使用功能XML),並使用功能接收器或類似功能將新內容類型推送到所有使用舊內容類型的列表,然後將舊內容類型標記爲隱藏。這樣可以保留舊的元數據,但不能使用新元數據以外的其他項目添加新項目。

如果您可以直接訪問生產環境,並且您的客戶治理計劃允許,則此問題的其他答案中提及的方法將是首選。然而,與SharePoint中的其他工件一樣,建議以結構化方式部署內容類型。以非結構化方式添加新內容類型會影響搜索相關性(託管屬性),並且還可能影響網站的一般分類(網站列未被重用等),因此即使可以直接在生產現場,我不會推薦它!

這將我引向最後的做法,至少對於未來的內容類型:至少對於未來的內容類型:從一開始就使用功能接收器以編程方式創建您的內容類型!這樣你就可以知道你的內容類型的真實狀態(僅限數據庫),並且你可以有一個結構化的方法來管理未來的變化!您可以通過以編程方式搜索「創建」內容類型來實現此目的的幾種方法SharePoint'

爲了完整:我提到了三種模式。您的內容類型可以處於的最後一種模式是「UnGhosted」。這意味着您的內容類型是使用功能XML創建的,但它已與12配置單元中的原始XML源斷開連接。

我的朋友SørenNielsen在內容類型 Audit your Content Type Hierarchy上有一些好點。上面描述的一些問題可以在MSDN文章Updating Content Types中發現。 Gary Lapointe也有一個STSADM擴展,用於解決內容類型的一些問題,請參閱Propagate Content Type Changes

不好意思,但主題很複雜,需要徹底解釋以避免任何誤解。

3

當您更新內容類型時,會出現一個複選框,您可以單擊以更新子內容類型。通過選中該框,列表內容類型將被更新。

請注意,如果您的確如此做而不是選中此框以更新子內容類型,則以後無法強制更新。因此,如果您不更新並且稍後希望子類型內容類型具有更新,則首先需要將更新反轉並將其更新。

.B

+1

您可以稍後以編程方式更新列表,而不是通過UI。 – Jason 2009-01-15 20:28:13

+1

對我來說看起來不錯,但我對編程方法更感興趣,因爲我們不會使用UI來創建內容類型 – drax 2009-01-16 07:16:34