我在feature.template.xml
中有以下内容...
<VersionRange BeginVersion="1.0.0.1" EndVersion="1.0.0.2">
<CustomUpgradeAction Name="1.0.0.1_TO_1.0.0.2"></CustomUpgradeAction>
</VersionRange>
<VersionRange BeginVersion="1.0.0.2" EndVersion="1.0.0.3">
<CustomUpgradeAction Name="1.0.0.2_TO_1.0.0.3"></CustomUpgradeAction>
</VersionRange>
...
我的功能升级事件如下:
public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
using (SPSite site = (SPSite)properties.Feature.Parent)
using (SPWeb mySite = site.RootWeb)
{
switch (upgradeActionName)
{
case "1.0.0.1_TO_1.0.0.2":
//execute logicA
break;
case "1.0.0.2_TO_1.0.0.3":
//execute logicB
break;
default:
break;
}
}
我说的是,如果该站点当前是1.0.0.0版本,它将升级到v 1.0.03,执行上面的logicA和logicB。这意味着sharepoint会为每个版本升级调用featureupgrading事件。这是正确的吗?或者我需要做一些不同的事情来实现这个目标吗?
我也有以下问题:
任何帮助都会受到高度赞赏,因为我没有在网上或书上找到任何好的相关细节。
答案 0 :(得分:3)
向VS SharePoint项目添加新功能时,Visual Studio会使用版本0.0.0.0初始化功能 在属性窗口中,您可以设置功能的版本号。 如果要升级现有功能,则必须定义要进行升级操作(代码,新清单,...)的版本范围。
例如:您在不更改版本号的情况下部署了您的功能。您当前部署的功能版本号为0.0.0.0。 您希望升级功能并将版本号设置为2.0.0.0。
如果您按如下方式定义版本范围:
<VersionRange BeginVersion="1.0.0.0" EndVersion="2.0.0.0">
当你调用SPFeature.Upgrade()时,你会发现什么都不会发生,因为0.0.0.0不在定义的版本范围内。
如果您使用此版本范围
<VersionRange EndVersion="2.0.0.0">
或
<VersionRange BeginVersion="0.0.0.0" EndVersion="2.0.0.0">
您会注意到您的FeatureUpgrading事件接收器或其他升级操作将被触发。
您升级的功能现在的版本号为2.0.0.0
如果再次调用SPFeature.Upgrade,则不会再发生任何事情,因为2.0.0.0超出了定义的版本范围。所以包括BeginVersion,EndVersion不包括。
如果使用后一版本范围,则每个版本号介于[0.0.0.0 - 1.x.x.x]之间的功能都将升级。
我认为您也可以完全保留BeginVersion和EndVersion属性。然后,您将在每次SPFeature.Upgrade()调用时触发upgradeactions。 (待验证)
欲了解更多信息:Chris O'Brien写了一篇关于这个主题的有趣文章系列,cfr。 http://www.sharepointnutsandbolts.com/2010/06/feature-upgrade-part-1-fundamentals.html