本文章是由機器翻譯。

Business Connectivity Services

透過 SharePoint BCS 取用外部 OData 摘要

Eric 白色

Microsoft 商務連線服務 (BCS) 是 Microsoft Office 2010 及可協助開發人員的 SharePoint 2010 一項功能,使用者將資料送回 SharePoint。顯露在 SharePoint 中的外部資料讓使用者能夠建置複合應用程式,讓他們更好的存取重要的資訊,使得它們之間的互動資訊變得更方便。

BCS 提供您可以使用外部資料帶入 SharePoint 的三個基本機制。首先,您可以連線到與使用透過 SQL 查詢的資料庫。根據預設,支援 SQL Server。一些工作,您可以連線至 MySQL、 Oracle 及其他資料庫管理系統。

第二,您可以使用公開方法,請依照下列的方法原型的特定模式的 Web 服務。

第三,您可以使用 Microsoft。若要連接至資料來源 Net 和 C# 或 Visual Basic 程式碼。最常見的方式是撰寫。NET 組件連接器。

在本文中,我將告訴您的第三個方法:撰寫。NET 組件連接器使用開啟資料通訊協定 (OData) 餵送。

為何。NET 組件連接器?

與 burgeoning OData 摘要的激增,您可能需要使用其中一個那些餵送到啟用有趣的功能,為您的使用者。BCS 並不會擁有內建的能力,可使用 OData 摘要,但它的相當容易撰寫。NET 組件連接器來執行這項操作。

這也是示範如何撰寫的方便方法。NET 組件連接器。另一種方法是撰寫自訂連接器來使用 SQL 資料庫,但這是個非必要,因為 BCS 可以輕鬆地使用現成的 SQL 資料來源。遠,來示範書寫。NET 組件連接器使用資料庫需要您安裝並適當地設定資料庫。這並不困難,但它將新增一些額外的步驟及變複雜的範例。相反地,撰寫。NET 組件連接器使用餵送現有 OData 不可以是簡單的。

本範例也示範如何實作建立,使用 OData 的讀取、 更新和刪除 (CRUD) 作業。您會看到這是只是多麼的容易。

您可能會訝異看到您需要撰寫若要建立只少到什麼程度的程式碼。NET 組件會消耗的 OData 餵送的連接器。資料存取技術有不少,和 OData 承諾要啟用新的產生及取用資料的應用程式之間的互通性層級。

請注意 SharePoint 設計工具來建立的模型、 開發和發佈 BCS 外部內容類型的另一種方法。原生 SharePoint 設計工具支援的建置後端 SQL 資料庫和 Web 服務具有相當平面資料結構的商務實體模型。使用 SharePoint 設計工具可以簡化 (並可降低) BCS 的開發工作。不過,它不會以原生方式支援 OData 服務目前。

OData 與 SharePoint

OData 是一種網路協定來查詢及更新現有的 Web 技術,例如 HTTP、 Atom 發行通訊協定 (AtomPub) 和 JSON (build) 的資料。OData 用來公開 (expose) 並從各種來源包括關聯式資料庫、 檔案系統、 內容管理系統和傳統的網站存取資訊。OData 的良好簡介,請參閱 「 建置豐富網際網路應用程式與開啟資料通訊協定 」 (msdn.microsoft.com/magazine/ff714561),從 2010 年 6 月發行的 msdn Magazine。發行項所編寫的 Shane Burgess,在 [資料] 和 [在 Microsoft 的模型群組計劃經理的其中一個。

SharePoint 基礎 2010年和 SharePoint 伺服器 2010年將清單資料公開為摘要 OData。依預設會啟用這項功能。如果您有安裝 URL http://intranet.contoso.com 在 SharePoint 網站,您可以將您的瀏覽器輸入 http://intranet.contoso.com/\_vti\_bin/listdata.svc 擷取站台的 SharePoint 清單的集合。

如果您公司的 SharePoint 2010 網站包含 「 我的網站 」 功能,而且您的別名也就是說,ericwhite,您可以看到將您的瀏覽器輸入 http://my/sites/ericwhite/_vti_bin/listdata.svc 公開在我的網站上的清單。在任何情況下,您會看到 atom 摘要時如中圖 1在瀏覽器中顯示。

圖 1OData 從 SharePoint 清單

使用。NET Framework 中,使用餵送 OData 的簡單方法是使用 WCF 資料服務。若要加入服務參考 OData 摘要,使用 Visual Studio,IDE 會自動產生程式碼,以供您使用強型別的類別查詢和更新摘要。我將引導您完成此程序。

如需有關如何運作的詳細資訊,請參閱 WCF 資料服務開發人員中心 (msdn.microsoft.com/data/bb931106),它具有初學者指南和資源的連結。

快速入門

如先前所述,SharePoint 2010 會公開清單資料,如 OData 摘要。若要存取摘要簡單方法是透過。NET 組件連接器,跟我將引導您完成建立該連接器的程序。

這個程序會建立外部的內容型別,您可以顯示及維護外部清單中。這看起來可能有點很有趣 — 使用此範例之後,您將有 SharePoint 網站,其中包含兩個清單具有完全相同的資料。其中一個清單會 SharePoint 清單,您建立並設定依平常的方式。[其他] 清單會顯示來自 OData 的第一個清單餵送的資料的外部清單。如果您新增或變更其中一個清單中的記錄時,所做的變更顯示在另一個。

這種方法的主要優點是很容易建置和執行範例。您不需要安裝任何基礎結構的範例。您需要的就是您擁有伺服陣列系統管理員存取權的 SharePoint 伺服器陣列。

如果您還沒有基礎結構,最簡單的方法執行這個範例是下載的 2010年資訊工作者示範和評估虛擬機器 (bit.ly/gBKog8)。都 VM 的虛擬機器有完整的 SharePoint 2010,Visual Studio 2010、 Office 2010 以及執行許多已安裝,工作複本得多。這個範例示範這個發行項運作不在這個 VM 中的修改。

如果您有自己的 SharePoint 2010 開發環境,很容易適當地修改這個範例 (如我遍,我將指示的位置)。不過,如果您剛開始使用 SharePoint 開發,並繼續嘗試幾個例子,VM 是沒錯。

建置此範例的第一個步驟是要進一步瞭解使用 OData 來操作 SharePoint 清單中的資料。在這個範例中,您要連線至公開 (expose) 使用 OData 的客戶清單的客戶關係管理 (CRM) 系統。

首先,建立一個包含代表客戶的一些記錄的 SharePoint 清單。

  1. 開啟瀏覽器、 瀏覽到 SharePoint 網站,以及建立名為客戶的自訂清單。
  2. 將 [職稱] 欄的名稱變更為 [客戶編號]。
  3. 建立新的資料行名為這裡的客戶名稱,與單行文字類型。
  4. 建立新的資料行名為時代,與數字的型別。
  5. 新增一些記錄。

現在,登入以系統管理員身分 VM,並啟動 Visual Studio 2010。建立新的 Windows 主控台應用程式。建置這些 OData 範例,但這無所謂無論您建置的。NET 架構 4 或。NET Framework 3.5。不過,在建置時。NET 組件連接器之後,您必須為目標。NET Framework 3.5,因為它是目前支援 SharePoint 2010 年的唯一版本。若要讓 Visual Studio 產生具有良好的命名空間名稱的類別,Contoso 這個專案的名稱。

稍後在本文中我將討論 OData 和 BCS 的命名空間名稱。NET 組件連接器。有特定方法您可以產生命名空間名稱正確,並在此情況下,命名空間名稱將最有意義依進行專案康得股份有限公司的名稱。

在 Visual Studio] 功能表中,按一下專案,然後按一下 [加入服務參考]。在 [加入服務參考] 對話方塊中輸入 SharePoint 網站的 OData 服務 URL。如果您正在使用這個示範 VM,服務 URL 是 http://intranet.contoso.com/\_vti\_bin/listdata.svc。

如果您要連線到 SharePoint 網站在不同的 URL,請您將需要調整為適當的服務 URL。

按一下 [Go]。Visual Studio 就會嘗試連線至的位置,並從 SharePoint 網站下載中繼資料。如果成功的話,它會加入服務參考] 對話方塊中的 [服務] 清單中顯示的服務名稱。因為您模擬了 CRM 系統,請在 Namespace 欄位中輸入 Crm。按一下 [確定]。很有趣檢查產生的程式碼。按一下 [顯示所有檔案] 按鈕,在 [方案總管] 視窗中,然後展開 Crm 命名空間、 展開 Reference.datasvcmap 並開啟 Reference.cs。它會看起來像這樣 (為了清楚起見移除註解):

namespace Contoso.Crm {
  public partial class TeamSiteDataContext : 
    global::System.Data.Services.Client.DataServiceContext {
    ...

由於如何您命名專案和服務參考命名空間,產生的類別的命名空間是 Contoso.Crm。 類別的客戶清單的完整限定的名稱是 Contoso.Crm.Customers,是合理的。

也請注意資料內容的產生的名稱。 在這種情況下,它是 TeamSiteDataContext。 產生這個類別的名稱根據您連線到 SharePoint 網站的名稱。 如果是這個示範 VM 中,您連線到預設網站的名稱會是小組網站。 如果您的環境不同,請注意資料內容類別的名稱,您可以適當地變更程式碼範例所示。

開啟 Program.cs,並更新中所示的程式碼圖 2。 如果您不使用示範 VM,調整 OData 服務 URL。 編譯並執行程式,請參閱查詢的結果。 如您所見,也不需要使用 OData 清單從擷取資料的程式碼的很多。

圖 2更新 Program.cs 的程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Contoso.Crm;

class Program {
  static void Main(string[] args) {
    TeamSiteDataContext dc =
      new TeamSiteDataContext(new Uri(
      "http://intranet.contoso.com/_vti_bin/listdata.svc"));
    dc.Credentials = CredentialCache.DefaultNetworkCredentials;
    var customers = 
      from c in dc.Customers
      select new {
        CustomerID = c.CustomerID,
        CustomerName = c.CustomerName,
        Age = c.Age,
      };
    foreach (var c in customers) 
      Console.WriteLine(c);
  }
}

與 OData CRUD 作業

現在讓我們試著插入客戶。 您的程式碼必須建立新的 CustomersItem,並初始化它的值。 然後它會呼叫 TeamSiteDataContext.AddToCustomers 方法,做為參數傳遞的 CustomersItem 物件。 最後,若要認可變更,您會呼叫 TeamSiteDataContext.SaveChanges。

在 Program.cs,請以下列程式碼取代客戶變數宣告和 foreach 迴圈:

CustomersItem cust = new CustomersItem();
  cust.CustomerID = "JANE08";
  cust.CustomerName = "Jane";
  cust.Age = 22;
  dc.AddToCustomers(cust);
  dc.SaveChanges();

若要更新客戶,您將查詢 [客戶] 清單中,擷取特定客戶更新。 然後更新適當的屬性。 呼叫 TeamSiteDataContext.UpdateObject 方法。 最後,會呼叫認可變更 TeamSiteDataContext.SaveChanges:

CustomersItem cust = dc.Customers
    .Where(c => c.CustomerID == "BOB01")
    .FirstOrDefault();
  if (cust != null) {
    cust.CustomerName = "Robert";
    dc.UpdateObject(cust);
    dc.SaveChanges();
  }

若要刪除客戶,查詢 [客戶] 清單中,擷取特定客戶刪除。 呼叫 TeamSiteDataContext.DeleteObject 方法。 呼叫認可變更 TeamSiteDataContext.SaveChanges:

CustomersItem cust = dc.Customers
  .Where(c => c.CustomerID == "BILL02")
  .FirstOrDefault();
if (cust != null) {
  dc.DeleteObject(cust);
  dc.SaveChanges();
}

如您所見,改變使用 OData 的 SharePoint 清單很簡單。

建置。NET 組件連接器

建置的過程中。NET 組件連接器,您定義表示會公開為外部的內容型別之實體的類別。在這個範例中,您定義客戶類別表示客戶清單中的項目。某些方法,例如方法,以建立客戶,採取這個類別的執行個體當做引數。其他方法,例如在清單中,傳回所有客戶的方法會都傳回此類別的執行個體的集合。

您也可以設定 BCS 模型,描述這個類別在 XML 方言。基礎 BCS 的基礎結構會在 BCS 模型的 XML 定義中使用的資訊,使外部的內容型別是使用 SharePoint 2010 內。

如果沒有您應從這份文件的一個關鍵點,則這:您必須先完全符合實際定義的類別的模型。

有可協助您進行符合實際的類別的 BCS 模型定義。不過,重點是透過一種方法或另一個,必須小心驗證模型符合實際的類別。

在更常見的 BCS 實作中,您將定義許多這些類別,並建立全部都在 BCS 模型定義的模型。大量實作複雜的 BCS 方案時是工作的要讓符合類別的模型。

現在讓我們來建置連接器。為使本範例將會是才剛剛建置一個唯讀。NET 組件連接器,但一次您已了解基本概念,很容易新增 CRUD 功能的其餘部分。

這份文件的程式碼下載包含程式碼和 BCS 模型 CRUD 功能; 它就不會出現在示範 VM 的修改。

以系統管理員身分登入 SharePoint 開發電腦。您必須建置和部署的伺服陣列系統管理員權限。NET 組件連接器。

啟動 Visual Studio 2010。建立新的專案。建立新的 SharePoint 2010 商務資料連線 (BDC) 模型應用程式。如之前,您必須為目標。NET Framework 3.5。專案康得股份有限公司的名稱,然後按一下 [確定]。同樣地,我們將使用專案名稱,將會使用命名空間中康得股份有限公司。

在 SharePoint 自訂精靈中,您可以輸入 SharePoint 網站的本機網站 URL 進行偵錯。在這個精靈的這個示範 VM,URL 是正確地設定預設為 http://intranet.contoso.com。如果您正在使用 SharePoint 網站在不同的位址,請變更這個 URL。精靈也可讓您知道這個專案將會部署為伺服陣列解決方案。按一下 [完成]。有點等候執行精靈。

重新命名在 [方案總管從 BdcModel1 到 ContosoBdcModel 的 BDC 模型節點。

接下來,開啟 「 BDC 總管 」 窗格 ([方案總管] 旁邊的向右的預設值)。重新命名 ContosoBdcModel 三個 BdcModel1 節點。在 [BDC 總管] 中,您無法直接重新命名樹狀控制項中的每個節點。相反地,您要選取每個節點,然後修改 [屬性] 窗格中的名稱 (請參閱圖 3)。

圖 3變更模型名稱

下一個步驟是重新命名實體與指定之實體的識別項。在 BDC 設計工具中選取 Entity1。選取實體之後, 您可以變更 [屬性] 窗格中相應的名稱。將它的名稱給客戶,並將其命名空間變更為 Contoso.Crm。

在 BDC 設計工具中,按一下 Identifier1,然後將它的名稱變更為 [客戶編號]]。您也需要設計 BDC 總管中的實體。此組件需要精確地執行。如果沒有 BDC 模型與您要使用的實際類別之間不相符,結果是未定義,而且錯誤訊息不一定照亮。在某些情況下,您只出了什麼問題的線索會是外部的內容類型的清單網頁組件無法載入。

展開 [BDC 總管] 中的節點,直到您所見下 ReadItem 方法的 id 參數的 Identifier1 節點。將它的名稱變更為 [客戶編號]。展開樹狀目錄,直到您看見下 ReadItem 方法 returParameter 的 Entity1 節點。變更實體的名稱給客戶,並將型別名稱變更為 Contoso.Crm.Customers,ContosoBdcModel。

您即將完全重新定義客戶實體,所以刪除客戶實體中的 [Identifier1] 和 [訊息] 節點。

在 [客戶] 上按一下滑鼠右鍵,按一下 [新增型別描述項。新的型別描述項的名稱重新命名為 [客戶編號]。根據預設,新的型別描述項的類型是設定為 System.String,也就是您想為使本範例。在 [屬性] 窗格中,向下捲動直到您看到的識別項欄位。使用下拉式清單來變更其值為 [客戶編號]。

同樣地,客戶上按一下滑鼠右鍵,按一下 [新增型別描述項。重新命名為這裡的客戶名稱。它的型別是 System.String,這是正確。

新增另一個型別描述項、 重新命名為時代,並將其型別變更例如 System.Int32。進行這些變更之後,「 BDC 總管 」 窗格看起來就像圖 4。展開 [ReadList] 節點、 展開 [returnParameter] 節點和重新命名為 CustomersList 的 Entity1List。型別名稱設定為下列:

System.Collections.Generic.IEnumerable`1[[Contoso.BdcModel1.Entity1, ContosoBdcModel]]

圖 4已完成的客戶實體

這個語法中,包含後面接著一 ('1) 的上一步刻度是代表具有一個型別參數的泛型類別的語法。雙精度浮點數的方括號中的型別是由完整的型別,以及包含的型別 BDC 模型的型號名稱所組成。變更型別名稱為:

System.Collections.Generic.IEnumerable`1[[Contoso.Crm.Customer, ContosoBdcModel]]

這會對應到一種 IEnumerable <Contoso.Crm.Customer>,其中的客戶型別中找不到 ContosoBdcModel。

刪除 Entity1 節點的 CustomersList 節點子系。 複製您最近已設定為 returnParameter 的 ReadItem 方法的子型別描述項的客戶實體。

選取 [CustomersList] 節點下方的 ReadList 方法,returnParameter 並貼上客戶實體。

返回 [方案總管] 視窗中,並編輯 Feature1.Template.xml 檔案。 將 SiteUrl 屬性值為 SharePoint 網站的 URL 加入:

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="https://schemas.microsoft.com/sharepoint/">
  <Properties>
    <Property Key="GloballyAvailable" Value="true" />
    <Property Key="SiteUrl" Value="http://intranet.contoso.com" />
  </Properties>
</Feature>

重新命名 Customers.cs Entity1.cs。 使用下列程式碼定義組件連接器的客戶實體取代 Customers.cs 的內容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Contoso.Crm {
  public partial class Customer {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public int Age { get; set; }
  }
}

使用中的程式碼取代 CustomersService.cs 中的程式碼圖 5,其中定義的方法,擷取單一項目,並擷取項目的集合。

圖 5CustomersService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using Contoso.Crm;

namespace Contoso.Crm {
  public class CustomersService {
    public static Customer ReadItem(string id) {
      TeamSiteDataContext dc = new TeamSiteDataContext(
        new Uri("http://intranet.contoso.com/_vti_bin/listdata.svc"));
      dc.Credentials = CredentialCache.DefaultNetworkCredentials;
      var customers = 
        from c in dc.Customers
        where c.CustomerID == id
        select new Customer() {
          CustomerID = c.CustomerID,
          CustomerName = c.CustomerName,
          Age = (int)c.Age,
        };
      return customers.FirstOrDefault();
    }

    public static IEnumerable<Customer> ReadList() {
      TeamSiteDataContext dc = new TeamSiteDataContext(
        new Uri("http://intranet.contoso.com/_vti_bin/listdata.svc"));
      dc.Credentials = CredentialCache.DefaultNetworkCredentials;
      var customers = 
        from c in dc.Customers
        select new Customer() {
          CustomerID = c.CustomerID,
          CustomerName = c.CustomerName,
          Age = (int)c.Age,
        };
      return customers;
    }
  }
}

緊接著在本篇文章開頭所描述的程序,加入服務參考至網站,指定命名空間的 Crm。按一下 [確定]。建置方案,即可建置 |建置康得股份有限公司。現在,將方案部署即可建置 |部署康得股份有限公司。

授與存取這個外部的內容類型的所有已驗證之使用者的權限。開啟 [管理中心],然後按一下 [管理服務應用程式。按一下 [商務資料連線服務]。按一下您剛剛新增的外部內容類型] 旁邊的向下箭號,然後按一下 [設定權限。按一下 [文字] 方塊的正下方的 [瀏覽] 按鈕。按一下 [所有使用者,然後都按一下 [所有已驗證的使用者。按一下 [新增] 按鈕,然後按一下 [確定]。

回到 [設定物件權限] 視窗中,按一下 [新增] 按鈕,然後設定 [編輯]、 [執行]、 [可選取的 「 以下列在用戶端] 及 [設定權限的權限。按一下 [確定]。

瀏覽至 SharePoint 網站。建立新的外部清單。指定清單的名稱 CustomersExt。按一下 [外部內容的型別瀏覽器上。在外部的內容型別選擇器,按一下您剛建立的外部內容類型。如果您正在使用這個示範 VM,您剛建立的內容類型會在清單中只外部內容的型別。按一下 [確定]。

按一下 [建立] 按鈕,等待一個位元,如果一切順利,您會看到新的外部清單包含相同的資料做為客戶清單。

如果您新增記錄至規則清單時,您會看到它出現在 [外部] 清單中。您可以玩一玩資料位元。新增、 刪除或變更一般 SharePoint 清單中的部份記錄,並查看顯示在 [外部] 清單中的資料。

彙整所有片段

如您所見,它會是很容易使用 WCF 資料服務進行查詢及修改摘要 OData。它也是個直接的流程,若要建立透過外部的內容型別。NET 組件連接器。您可以連線到任何資料來源使用。NET 組件連接器。

這只是一個簡單的範例採用隨時可存取的資料來源,但模式很容易擴充至任何資料來源與送紙 OData。若要深入了解 BCS 自訂,請參閱 MSDN 文件庫頁面 」 商務連線服務操作說明和逐步解說 」 (msdn.microsoft.com/library/ee557949)。另外還有 OData 的 MSDN 資料開發人員中心的相關資訊的 trove (msdn.microsoft.com/data/bb931106) 和開啟資料通訊協定站台 (odata.org)。

Eric White 是一個獨立的軟體開發人員和作者等 25 年的經驗開發企業應用程式在各種不同的平台。他的專長目前是在 Microsoft Office 技術,包括 Open XML、 SharePoint 和 Office 用戶端開發中。您可以依照他在 Twittertwitter.com/EricWhiteDev 或他的部落格,在 ericwhite.com/blog

多虧了要對下列技術專家,來檢閱這份文件:Ying Xiong