我有一个假设性的问题(至少现在是这样):
假设我基于一些自定义内容类型创建列表。我在该列表中添加了约1000个项目(正在生产中)。然后客户来了,他说他需要修改该自定义内容类型。
如果我修改自定义内容类型,列出该怎么办?它会自动更新(我怀疑)吗?那已经创建的列表项呢?
你们当中有人有经验吗?
最佳答案
因此,与内容类型有关的几个问题:
首先,内容类型有两种:网站内容类型和列表内容类型。网站内容类型是驻留在库中的"template"。在列表中使用站点内容类型时,该内容类型将实例化为给定列表上的列表内容类型。
其次,可以通过多种方式创建和修改您的内容类型,这将决定数据库中数据以三种方式中的哪一种方式。
如果您已经使用GUI或通过使用API的自定义代码创建了内容类型,则您的站点内容类型和列表内容类型都在数据库中处于“仅数据库”状态。这意味着它正在数据库中寻找内容类型的定义。
如果您已在CAML中将内容类型创建为功能,则您的站点内容类型在数据库中被重影(或未定制,因为我们应该在v3中将其称为)。从根本上讲,这意味着数据库在12单元格中的功能XML中查找构成内容类型的站点列。因此,这意味着您可以更新功能,并且在更新内容类型中可以使用新的网站列,对吗?
不幸的是,不是:还记得我们还有列表内容类型吗?令人讨厌的是,这些列表内容类型是使用代码实例化的,因此它们处于“仅数据库”状态。这意味着您所做的更改只会显示在您的网站内容类型中,而不会显示在使用该内容类型的现有列表中!
有几种方法可以解决此问题,解决方案取决于您的需求和所进行的更改(删除字段,添加字段,更改字段)。
例如,即使内容类型随时间而变化,您通常还是希望保留现有的项目元数据。如果通过代码推送列表内容类型中的更改,则将丢失存储在已更改/已删除字段中的数据。一种解决方案是在旧内容类型的基础上添加一个全新的内容类型,但要更改字段。您将添加新的内容类型(通过代码或使用功能XML),并使用功能接收器或类似功能将新的内容类型传播到所有使用旧内容类型的列表,然后将旧内容类型标记为隐藏。这样就可以保留旧的元数据,而不能使用除新的元数据以外的其他项添加新的项。
如果您可以直接访问生产环境,并且您的客户治理计划允许,则最好使用在此问题的其他答案中提到的方法。但是,与SharePoint中的其他工件一样,建议以结构化的方式部署内容类型。以非结构化的方式添加新的内容类型将影响搜索的相关性(托管属性),并且还可能影响网站的一般分类法(网站列未重复使用等),因此即使可以将这些更改直接添加到网站中生产现场,我不推荐!
这使我得出了我将推荐的 final方法,至少对于将来的内容类型来说是这样:建议使用功能接收器从头开始以编程方式创建您的内容类型!这样,您将始终了解内容类型的真实状态(仅数据库),并且可以采用结构化的方法来管理将来的更改!您可以通过谷歌搜索“以编程方式创建“内容类型” SharePoint”找到几种方法
为了完整性:我提到了三种模式。您的内容类型可以使用的最后一种模式是“UnGhosted”。这意味着您的内容类型是使用功能XML创建的,但已与12个配置单元中的原始XML源断开连接。
我的 friend 索伦·尼尔森(SørenNielsen)在内容类型上有一些要点
在Audit your Content Type Hierarchy中。在MSDN文章Updating Content Types中可以简短地提到上述一些问题。
Gary Lapointe还具有STSADM扩展名,可解决内容类型的某些问题,请参见Propagate Content Type Changes。
对不起,但主题很复杂,需要详尽的解释以避免任何误解。
关于Sharepoint:更新内容类型时,基于内容类型的列表会如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/446451/