如何:结合使用 Business Connectivity Services 与 SharePoint 工作流
上次修改时间: 2010年4月16日
适用范围: SharePoint Server 2010
利用 Microsoft Business Connectivity Services (BCS),可以通过两种方式访问 SharePoint 工作流中的外部数据:
通过使用 Microsoft SharePoint Designer 2010 创建的与外部列表交互的无代码工作流。
通过在 Microsoft Visual Studio 中创建的、与外部列表、Microsoft SharePoint 2010 对象模型或 Business Connectivity Services 对象模型交互的包含代码的工作流(代码工作流)。
在为方案创建工作流之前,请考虑:
**工作流无法与外部列表关联。**在 SharePoint Server 2010 中,虽然工作流使用了外部列表,但工作流不能与外部列表直接关联。可以创建网站工作流,或具有 SharePoint 列表中的列表工作流(如文档库)并从外部列表读取或更新它。您还可以将外部列表项用作 SharePoint Designer 中任务流程的目标;但指向任务的链接将不会显示外部列表项的标题。
**访问 Business Data Connectivity (BDC) Service 的工作流总是在服务帐户下运行,即使在模拟步骤中也是如此。**工作流总是在服务帐户下运行,并且仅在使用Secure Store Service或 RevertToSelf(由于存在安全隐患,因此默认情况下将禁用它,有关详细信息,请参阅 Business Connectivity Services 安全概述)。此限制可帮助保护 SharePoint 2010 不受恶意 BDC 模型和代码的危害。由于始终是通过一个帐户来访问后端系统,因此您可能会丢失对更改者的跟踪。可让工作流将 SPUser 名称传递到外部列表上的列或使用 BDC API 的自定义活动。提供此方案仅供参考,而不应将其用作安全功能。
在 SharePoint 列表中定义无代码工作流以使用 SharePoint Designer 2010 更新外部列表
利用 SharePoint Designer 2010,可以创建不使用代码的工作流(无代码工作流),这些工作流可附加到任何 SharePoint 列表和网站。扩展针对 SharePoint 列表的"创建列表项"、"更新列表项"和"删除列表项"工作流活动以支持外部列表。此外,可以将其他活动(如"设置工作流变量")与外部列表一起使用以从 SharePoint 列表选取列表或者项。在添加或更改列表项时会自动启动列表工作流,这些工作流可包含关联的操作的条件逻辑。网站工作流无需触发即可启动。
通过使用 SharePoint Designer 2010,可以在 SharePoint 列表中配置列表活动(如"创建列表项"或"更新列表项")以便在外部列表中读取或写入数据。例如,只要默认 SharePoint 列表中的列表项或文档库中的文档发生更改,就可以创建更新外部列表中列表项的工作流。以下过程将指导您完成用于创建一个简单工作流的步骤,该工作流将在 Customer Contacts 文档库中为客户添加 New Contact Information 文档时更新 Customers 外部列表中的"Address"字段。
创建一个工作流,该工作流在文档库中创建新项时将自动更新外部列表
在 SharePoint Designer 2010 中,浏览到 Customer Contacts 文档库。
在服务器功能区上,单击"新建列表工作流"。
指定工作流的名称和说明,然后单击"下一步"。SharePoint Designer 2010 中将打开工作流设计器。
插入"更新列表项"操作,如图 1 所示。
图 1. 插入"更新列表项"操作
单击此列表链接,浏览到"List"字段中的 Customers 外部列表并将其选定。单击"添加"按钮以在外部列表中添加要更新的字段。
图 2. 在外部列表中添加要更新的字段
在"分配值"对话框中,从外部列表中选择要更新的"Address"字段,并在文档库中选择匹配的"Address"字段,然后单击"确定"。
备注
"分配值"对话框中会显示 SpecificFinder 的返回参数中的所有字段。如果 Creator 或 Updater 只需要一小部分字段,请在此对话框中仅选择这些字段。
图 3."分配值"对话框
在源列表和目标列表中指定匹配的字段,以便 SharePoint 能够标识文档库和外部列表中的匹配项。为此,请从外部列表中选择"CustomerID"字段,并从文档库中选择"Current Item: Client Id"字段(假定这些字段可用于标识两个列表中的匹配项)。单击"确定"。
图 4. 在源列表和目标列表中指定匹配的字段
此时已创建一个用于更新外部列表的简单工作流,如图 5 所示。
图 5. 用于更新外部列表的简单工作流
若要在 Customer Contacts 文档库中创建新项时自动启动此工作流,请单击功能区上的"工作流设置"按钮,再单击"创建项目时自动启动工作流",如图 6 所示。
图 6. 工作流启动选项
此时已成功创建一个工作流,该工作流在文档库中创建新项时将自动更新外部列表。
有关工作流的活动、使用和常见错误的提示
在以下方案中使用内置 SharePoint 工作流:
必须读取外部列表中的少量列以便稍后在工作流中使用。
从同一外部列表项读取多个值不会缓存该项。因此,该活动首先调用 Read List 方法 (Finder),然后为读取的每个列调用读取项方法 (SpecificFinder)。这样一来,从包含 2,000 个项的列表中读取 10 个属性会导致调用 BDC 20 次,并从外部系统中检索 20,010 个项。
必须在外部列表中创建、更新或删除一个项。
了解以下几点非常重要:
从不具有值的项读取值会返回 null。在 SharePoint 2010 中,这与 empty 相同,但在外部列表中,null 与未找到之间存在差异。
在外部列表中创建一个项后,通过同一工作流对该项进行的任何更改都必须使用从"创建列表项"返回的 BDC 标识。
默认情况下,Business Connectivity Services 会显示所有 SpecificFinder 字段。因此,如果 Creator 或 Updator 只需要一小部分字段,则在 SharePoint Designer 2010 的工作流用户界面中仅选择所需的字段。
只能从 Creator 获取 BDC 标识。若要查找刚创建的外部项,则应使用由 Creator 返回的 BDC 标识。无法通过使用任何其他字段查找该项。另外,若要查找刚更新的外部项,则无法使用 BDC 标识,这是因为 Updator 不会返回该项。只能通过其他字段来查找它。
如果创建的是用于 InfoPath 表单的工作流,请确保在发布过程中将表单模板中的正确字段提升为 SharePoint 列,以便能在工作流条件和操作中使用它们。
使用 Visual Studio 创建基于代码的工作流
通过使用 Visual Studio,可以创建通过外部列表或 SharePoint 2010 对象模型和 Business Connectivity Services 对象模型与外部数据交互的代码工作流。还可以创建自定义工作流活动。有关详细信息,请参阅 SharePoint 2010 SDK 中的 SharePoint 工作流主题。