SharePoint 2010中BCS最強的的地方無疑就是能使用.NET程式集作資料來源了。這種DLL類庫名為程式集系統。 業務資料目錄(BDC)可以直接連接SQL Server資料來源,但當我們要做的事更複雜(如需要從兩個不同的資料來源擷取資料並混合使用)時,之前的做法是不得不構建一個Web Service層來實現。現在,直接用.NET程式集就可以了,再也不必構建輔助的Web服務。當然,如果你更傾向於WCF服務,也是不錯的解決方案。
Visual Studio 2010內建了一整套BCS建模的工具,包括設計器,代碼編寫與調試工具。
接下來,我們就看看如何用Visual Studio 2010構建用於BCS的.NET 程式集。
1、開啟Visual Studio 2010並建立一個項目。選擇SharePoint 2010項目類型下的Business Data Connectivity Model模板。
2、當項目建立出來後,你可以看到在模型設計介面上有一個實體。
同時,還可以看到在BdcModel1檔案夾下有兩個類:Entity1.cs和Entity1Service.cs。我們將不會動這些預設的東西,以便在構建我們自己的自訂BCS實體時作為一個參照。
3、 這次演練我們還是用到AdventureWorks2000範例資料庫。
4、 我們將建立一個實體映射到資料庫裡的部門表。從Visual Studio 2010工具箱中拖放一個Entity形狀到bcs模型設計介面上。
5、你會注意到當你建立一個空白的BCS實體時也會同時為你建立一個EntityService.cs檔案。 BCS會將所有與該實體相關的C#方法都放在這裡。
重新命名我們的實體為——Department
然後,右鍵點擊該實體的Methods一節 ,添加一個新方法,名為GetDepartments。
注意到當我們改變實體的名稱為Department後,EntityService.cs也自動重新命名成DepartmentService.cs。如果你開啟DepartmentService.cs就會看到剛過建立的方法也在其中。
6、現在,我們開始寫一點代碼,將所需資料取回來。 右擊項目,添加一個LINQ 2 SQL類。在開啟的LINQ 2 SQL視圖裡通過伺服器總管串連到AdventureWorks2000資料庫,並拖放Departments表到設計介面中。
7、這樣,我們就可以用自動產生的LINQ 2 SQL Department類返回我們所需的資料了。 這裡,我發現最好還是再在我們的BCS model檔案夾下定義一個我們自己的Department類。主要基於以下考慮:
——你需要定義所有由BCS返回的欄 。LINQ 2 SQL的類可能會返回一些我們不需要用在BCS模型中的屬性。如果你直接使用LINQ 2 SQL的類,其中包含一些沒有在BCS模型中定義的類屬性,則會引發錯誤。
——這樣做還可以實現從兩個不同的源擷取資料,單表現出來的是一個實體。
——況且我感覺使用自己的類型更容易更舒服些:) 這也有助於你將來做單元測試並保持代碼的清晰性。
因此,添加一個新的C#類到BDCModel1檔案夾下,命名為Department.cs,並為資料中想要以後用在BCS中的每一個欄添加屬性。
public class Department
{
public Int16 DepartmentId { get; set; }
public string Name { get; set; }
public string GroupName { get; set; }
}
8、接下來,開啟DepartmentService.cs檔案,將GetDepartments方法聲明改為:
public static IEnumerable<Department> GetDepartments()
9、編寫LINQ 2 SQL代碼擷取資料,替換
throw new System.NotImplementedException();
為
DepartmentDataContext db = new DepartmentDataContext("server=localhost;database=adventureworks2000;uid=***;pwd=***");
return from d in db.Departments
select new Department
{
DepartmentId = d.DepartmentID,
Name = d.Name,
GroupName = d.GroupName
};
10、接下來,我們需要使我們的BCS模型能夠識別由我們的方法返回的資料。返回到BCS模型視圖,右擊Department實體的Identifiers一節。添加一個新的標識符並命名為DepartmentId。在你的實體中選中該標識符時,可以從屬性面板看到更多資訊。將其類型改為System.Int16。
11、在為BCS模型描述我們的資料前,我們需要先建立一個返回參數。在BDC方法詳細資料面板中,通過parameters下拉框中點擊<add a parameter>建立一個。
設定該參數的Direction為Return。
接下來有一些工作需要在不同的面板間來回移動才能完成。但是,個人認為這是我找到的最符合BCS模型構建思路的方法了。
12、 下面我們回到BDC Explorer視圖。展開樹,找到我們的實體和方法。選中我們剛剛添加參數時建立的TypeDescriptor。當選中後,你會發現我們可以在屬性面板編輯其屬性值。將其屬性設定為:
Name : DepartmentList
Type Name :
System.Collections.Generic.IEnumerable`1[[BdcModelProject1.BdcModel1.Department, BdcModel1]]
IsCollection : True
13、右擊DepartmentList結點,選擇Add Type Descriptor
14、選中新加的類型描述器,設定其屬性值為:
Name : Department
Type Name : BdcModelProject1.BdcModel1.Department, BdcModel1
IsCollection : False
15、接下來我們要為需要從Department表中返回的每一欄建一個類型描述器 。右擊Department類型描述器並添加以下3個TypeDescriptor:
Name : DepartmentId
Type Name : System.Int16
Identifier : DepartmentId
Name : Name
Type Name : System.String
Name : GroupName
Type Name : System.String
這時的BDC Explorer樹應該是這個樣子:
16、然後,我們需要建立一個MethodInstance元素——它為BCS描述了我們的方法是一個什麼類型的方法(如(Finder,SpecificFinder等)。
點擊Department實體,查看其BDC Details面板。通過Instance一節中的MethodInstance下拉框選擇"Create Finder Instance"。
選中剛建立的執行個體(instance),在屬性面板中設定其屬性值為:
Default : True
Default Display Name : Department List
Return Parameter Name : parameter
Return Type Descriptor Name : DepartmentList
17、在開始部署我們的模型前,先開啟DepartmentService.cs 。在進行完前面幾個建立BCS模型的步驟後,可能會產生第二個GetDepartments()方法。如果有,只需要把它刪了就行了。(具體這個重複的方法是哪一步產生的我也不清楚,等找到後再更新這一塊內容吧)
18、終於我們可以編譯我們的項目了。如果沒問題,就直接F5運行,過程中會自動將其打成WSP包並部署到SharePoint。
是在我的SharePoint網站裡通過業務資料列表Web組件顯示出來的我們的BCS外部資料。
注意:出現“訪問已被業務資料連線拒絕”的錯誤時,請參考微軟知識庫文章982271。
在接下來的一系列文章中,我們將瞭解到:
-建立一個SpecificFinder和IdEnumerator方法
-建立寫回和更新資料的方法
-建立彼此關聯的方法
等等更多的內容。
參考資料
Business Data Connectivity Model – Finder Method
BCS Shims – .NET assembly as a data source for Business Connectivity Services