9

我有一种假设性的问题(至少现在:))

假设我根据一些自定义内容类型创建列表。我在该列表中添加了大约 1000 个项目(在生产中)。然后客户来了,他说他需要修改那个自定义内容类型。

如果我修改自定义内容类型,列表会发生什么?它会自动更新(我怀疑)吗?那么已经创建的列表项呢?

你们有这方面的经验吗?

4

2 回答 2

17

所以有几个关于内容类型的问题:

首先,内容类型有两种类型:站点内容类型和列表内容类型。站点内容类型是驻留在图库中的“模板”。当在列表中使用站点内容类型时,该内容类型被实例化为给定列表上的列表内容类型。

其次,您的内容类型可以通过多种方式创建和修改,这将决定您的数据以三种模式中的哪一种出现在数据库中。

如果您已使用 GUI 或通过使用 API 的自定义代码创建了内容类型,那么您的站点内容类型和列表内容类型在数据库中都处于“仅限数据库”状态。这意味着它正在数据库中查找内容类型的定义。

如果您在CAML中创建了内容类型作为功能,则您的网站内容类型在数据库中是幻影(或未自定义,因为我们应该在 v3 中调用它)。这基本上意味着数据库在 12-hive 中的特征 XML 中查找构成内容类型的站点列。所以这应该意味着您可以更新该功能,并且您将在更新内容类型中提供新的站点列,对吗?

不幸的是没有:还记得我们也有列表内容类型吗?令人遗憾的是,这些列表内容类型是使用代码实例化的,因此它们处于“仅数据库”状态。这意味着您的更改只会出现在您的网站内容类型中,而不会出现在使用该内容类型的现有列表中!

有几种方法可以解决此问题,解决方案取决于您的需求以及您正在执行的更改类型(删除字段、添加字段、更改字段)。

例如,您经常希望保留现有的项目元数据,即使内容类型随时间而变化。如果您通过代码推送列表内容类型的更改,您将丢失存储在更改/删除字段中的数据。对此的解决方案是在旧内容类型的基础上添加一个全新的内容类型,但字段已更改。您将添加新内容类型(通过代码或使用功能 XML)并使用功能接收器或类似功能将新内容类型传播到使用旧内容类型的所有列表,然后将旧内容类型标记为隐藏。这样就可以保留旧的元数据,但不能使用新元数据以外的方式添加新项目。

如果您可以直接访问生产环境,并且您的客户治理计划允许,那么该问题的另一个答案中提到的方法将是首选方法。然而,与 SharePoint 中的其他工件一样,建议以结构化方式部署内容类型。以非结构化方式添加新内容类型会影响搜索相关性(托管属性),也可能会影响网站的一般分类(网站栏不被重用等),因此即使可以直接在生产网站,我不会推荐它!

这使我想到了我会推荐的最终方法,至少对于未来的内容类型:使用功能接收器从一开始以编程方式创建您的内容类型!这样您就可以始终了解内容类型的真实状态(仅限数据库),并且您可以采用结构化的方法来管理未来的更改!您可以通过谷歌搜索“以编程方式创建“内容类型”SharePoint”来找到几种方法

为了完整起见:我提到了三种模式。您的内容类型可以使用的最后一种模式是“UnGhosted”。这意味着您的内容类型是使用功能 XML 创建的,但它已与 12 hive 中的原始 XML 源断开连接。

我的朋友 Søren Nielsen 在Audit your Content Type Hierarchy中对 Content Types 有一些很好的看法。上面描述的一些问题可以在 MSDN 文章更新内容类型中找到简要提及。Gary Lapointe 也有一个 STSADM 扩展来解决与内容类型有关的一些问题,请参阅传播内容类型更改

很抱歉咆哮,但这个主题很复杂,需要彻底解释以避免任何误解。

于 2009-01-18T21:49:08.463 回答
3

当您更新内容类型时,您可以单击一个复选框来更新子内容类型。通过选中该框,将更新列表内容类型。

请注意,如果您选中更新子内容类型的复选框,则无法在以后强制更新。因此,如果您不更新并且稍后希望子内容类型具有更新,则您首先需要撤消更新并重新执行它。

.b

于 2009-01-15T15:32:32.277 回答