最近在处理SharePoint Office365的相关开发的时候发现了这样一个奇怪的现象:
无法通过API更新Editor field,只要已更新就会throw Exception,由于是Office365的Exception,无法单单从Exception中分析出问题原因,而且奇怪的是新创建的List也存在同样的问题。
试了半天也没找到解决办法,单单看field的SchemaXml也没发现什么比较特殊的地方。
无奈之下save了一个list template,上传到本地的SharePoint 2013环境,通过这个list template 新建了一个list,发现这样的list也存在相同的问题,仅通过Exception也没分析出什么问题,但是既然到本地了,我们可以看SharePoint Log啊,果然,在SharePoint Log中发现了一可疑的Error:
System.Data.SqlClient.SqlException (0x80131904): Parameter '@tp_Editor' was supplied multiple times.
经过在网上漫长的搜索,总算找到了个比较靠谱的答案:
http://help.share-gate.com/article/663-problem-with-the-sharepoint-database
通过进一步研究发现,产生该问题实际上是因为这个builtin的field被我们自己修改过,导致产生了version,进而导致在update时与默认的builtin column的SQL 更新字段即TP_Editor冲突,导致产生了这个问题。
对于SharePoint 2013来说,比较好的解决方案并不是像链接上所说了修改这个builtin column的schemaXML,而是应该将这个field的修改给revert回原来的状态,即调用下面一个方法:
spField.RevertCustomizations()
将field revert回去,这样再看field的schemaXMl就会发现燕来xml中的version attribute 就没有了