实体之间的关联

可以通过创建关联来定义业务数据连接 (BDC) 模型中的实体之间的关系。 Visual Studio 生成方法,这些方法为模型的使用者提供有关每个关联的信息。 SharePoint Web 部件、列表或自定义应用程序可以使用这些方法在用户界面(UI)中显示数据关系。

创建关联

通过在 Visual Studio 工具箱中选择关联控件、选择第一个实体(称为源实体),然后选择第二个实体(称为目标实体)来创建关联。 可以在 关联编辑器中定义关联的详细信息。 有关详细信息,请参阅 如何:在实体之间创建关联

关联方法

SharePoint 业务数据 Web 部件等应用程序通过调用实体服务类中的方法来使用关联。 可以通过在 关联编辑器中选择方法,将它们添加到实体的服务类中。

默认情况下, 关联编辑器 将关联导航方法添加到源实体和目标实体。 源实体中的关联导航方法使使用者能够检索目标实体的列表。 目标实体中的关联导航方法使使用者能够检索与目标实体相关的源实体。

必须将代码添加到其中每个方法,才能返回相应的信息。 还可以添加其他类型的方法以支持更高级的方案。 有关其中每个方法的详细信息,请参阅 支持的操作

关联类型

可以在 BDC 设计器中创建两种类型的关联:基于外键的关联和无键关联。

基于外键的关联

可以通过将源实体中的标识符与目标实体中定义的类型描述符相关联来创建基于外键的关联。 此关系使模型的使用者能够为其用户提供增强的 UI。 例如,Outlook 中的窗体使用户能够创建可在下拉列表中显示客户的销售订单;或 SharePoint 中的销售订单列表,使用户能够打开客户的个人资料页面。

若要创建基于外键的关联,请关联具有相同名称和类型的标识符和类型描述符。 例如,您可以在 Contact 实体和 SalesOrder 实体之间创建基于外键的关联。 实体 SalesOrder 将类型 ContactID 描述符作为 Finder 或 Specific Finder 方法的返回参数的一部分返回。 这两种类型描述符都显示在 关联编辑器中。 为了在 Contact 实体和 SalesOrder 实体之间创建一个基于外键的关系,请选择每个字段旁边的 ContactID 标识符。

将代码添加到源实体的 Association Navigator 方法,用于返回目标实体的集合。 以下示例返回联系人的销售订单。

public static IEnumerable<SalesOrderHeader> ContactToSalesOrder(int contactID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    IEnumerable<SalesOrderHeader> orderList = 
        from orders in dataContext.SalesOrderHeaders
             where orders.ContactID == contactID
             select orders;
    return orderList;
}

将代码添加到目标实体的Association Navigator方法中,该方法返回一个源实体。 以下示例返回与销售订单相关的联系人。

public static IEnumerable<Contact> SalesOrderToContact(int salesOrderID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    int TempContactID = (from orders in dataContext.SalesOrderHeaders
                     where orders.SalesOrderID == salesOrderID
                     select orders.ContactID).Single();

    IEnumerable<Contact> contactList = from contacts in dataContext.Contacts
                                     where contacts.ContactID == TempContactID
                                     select contacts;
    return contactList;

}

无外键关联

可以在不将标识符映射到字段类型描述符的情况下创建关联。 当源实体与目标实体没有直接关系时,请创建此类关联。 例如,SalesOrderDetail 表中没有用于映射 Contact 表中主键的外键。

如果要在SalesOrderDetail表中显示与Contact相关的信息,可以在Contact实体和SalesOrderDetail实体之间创建无外键关联。

Contact 实体的关联导航方法中,可以通过联接表或调用存储过程来返回 SalesOrderDetail 实体。

以下示例通过联接表返回所有销售订单的详细信息。

public static IEnumerable<SalesOrderDetail> ContactToSalesOrderDetail(int contactID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");

    IEnumerable<SalesOrderDetail> orderList =
        from orders in dataContext.SalesOrderHeaders
        join orderDetails in dataContext.SalesOrderDetails on
            orders.SalesOrderID equals orderDetails.SalesOrderID
        where orders.ContactID == contactID
        select orderDetails;
    return orderList;
}

SalesOrderDetail 实体的关联导航方法中,返回相应的 Contact。 下面的示例演示这一操作。

public static IEnumerable<Contact> SalesOrderDetailToContact(int salesOrderID, int salesOrderDetailID)
{
    const string ServerName = "MySQLServerName";
    AdventureWorksDataContext dataContext = new AdventureWorksDataContext
          ("Data Source=" + ServerName + ";" +
           "Initial Catalog=AdventureWorks;Integrated Security=True");
        
    int TempContactID = (from orders in dataContext.SalesOrderHeaders
                         where orders.SalesOrderID == salesOrderID
                         select orders.ContactID).Single();

    IEnumerable<Contact> contactList = from contacts in dataContext.Contacts
                                       where contacts.ContactID == TempContactID
                                       select contacts;
    return contactList;
}