2009-01-15 53 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

相关问题