1

如何从 powershell 脚本创建外部列表?

我有一个使用相当大的 powershell 脚本部署到 SharePoint 2010 服务器的解决方案。当脚本即将使用 BCS 模型作为数据源创建外部列表时,我得到了异常<nativehr>0x80131600</nativehr><nativestack></nativestack>

以下是用于创建列表的 powershell 代码的摘录:

# Remove the BCS model.
# Deploy the WSP package, including the BCS model.
# Delete the external list if it already exists.
...
$currentEntityName = $Entity.Name
Write-Host "BCS: Entity '$currentEntityName' - Granting permissions"
Grant-SPBusinessDataCatalogMetadataObject -Identity $Entity -Right $EntityPermissions -Principal $principal -ErrorAction SilentlyContinue
Grant-SPBusinessDataCatalogMetadataObject -Identity $Entity -Right $EntityPermissions -Principal $principalAllFlisUsers -ErrorAction SilentlyContinue
Grant-SPBusinessDataCatalogMetadataObject -Identity $Entity -Right $EntityPermissions -Principal $principalAllFlisUsersDemo -ErrorAction SilentlyContinue
Grant-SPBusinessDataCatalogMetadataObject -Identity $Entity -Right $EntityPermissions -Principal $principalAppPoolUser -ErrorAction SilentlyContinue
...
$ds = New-Object -TypeName Microsoft.SharePoint.SPListDataSource 
$ds.SetProperty("LobSystemInstance", $instanceName) 
$ds.SetProperty("EntityNamespace", $ns) 
$ds.SetProperty("Entity", $name) 
$ds.SetProperty("SpecificFinder", $sf.Name) 
...         
$site = Get-SPSite -Identity $SiteUrl 
$web = $site.OpenWeb($webNameString) 

$newList = $web.Lists.TryGetList("$ExternalListName")
if (!$newList)
{
    $ListGUID = $web.Lists.Add("$ExternalListName", "", [String]::Format($ListUrl, $ExternalListUrl), $ds) | out-null
    $web.Lists[$ListGUID].Update()
    $web.Update()
}

当我在$web.Lists.Add()接近尾声时调用该方法时引发异常。

在 ULS 日志中,我发现了一个可能相关的异常:

The type '        ProjectName.Common.CustomFieldTypes.ListSpecificCustomField,ProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff8505e11ea28a7e      ' could not be deserialized. Exception: System.TypeLoadException: Could not load type 'ProjectName.Common.CustomFieldTypes.ListSpecificCustomField' from assembly 'ProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff8505e11ea28a7e      '.     at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) ...

(注:我已将实际项目名称替换为 ProjcetName 并替换了自定义字段的名称)

该列表在 中可见,/_layouts/sitemanager.aspx但不显示任何数据。当一个 powershell 脚本正在测试它是否已经存在时,测试返回 true。

奇怪的是,当我重新运行整个 powershell 脚本时,列表被正确创建。然而,仅仅循环引用的脚本行以获得正确的部署是不够的。这使我认为 BCS 模型没有完全部署,或者 BCS 模型以某种方式被缓存并且在部署脚本运行时抵抗更改。

4

0 回答 0