如何:结合使用 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"字段。

创建一个工作流,该工作流在文档库中创建新项时将自动更新外部列表

  1. 在 SharePoint Designer 2010 中,浏览到 Customer Contacts 文档库。

  2. 在服务器功能区上,单击"新建列表工作流"。

  3. 指定工作流的名称和说明,然后单击"下一步"。SharePoint Designer 2010 中将打开工作流设计器。

  4. 插入"更新列表项"操作,如图 1 所示。

    图 1. 插入"更新列表项"操作

    插入更新列表项操作

  5. 单击此列表链接,浏览到"List"字段中的 Customers 外部列表并将其选定。单击"添加"按钮以在外部列表中添加要更新的字段。

    图 2. 在外部列表中添加要更新的字段

    将要更新的字段添加到外部列表中

  6. 在"分配值"对话框中,从外部列表中选择要更新的"Address"字段,并在文档库中选择匹配的"Address"字段,然后单击"确定"。

    备注

    "分配值"对话框中会显示 SpecificFinder 的返回参数中的所有字段。如果 Creator 或 Updater 只需要一小部分字段,请在此对话框中仅选择这些字段。

    图 3."分配值"对话框

    "分配值"对话框

  7. 在源列表和目标列表中指定匹配的字段,以便 SharePoint 能够标识文档库和外部列表中的匹配项。为此,请从外部列表中选择"CustomerID"字段,并从文档库中选择"Current Item: Client Id"字段(假定这些字段可用于标识两个列表中的匹配项)。单击"确定"。

    图 4. 在源列表和目标列表中指定匹配的字段

    指定匹配字段

    此时已创建一个用于更新外部列表的简单工作流,如图 5 所示。

    图 5. 用于更新外部列表的简单工作流

    简单工作流

  8. 若要在 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 工作流主题。