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 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();
为
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 : DepartmentListType Name : System.Collections.Generic.IEnumerable`1[[BdcModelProject1.BdcModel1.Department, BdcModel1]]
IsCollection : True
13、右击DepartmentList结点,选择Add Type Descriptor
14、选中新加的类型描述器,设置其属性值为:
Name : DepartmentType 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 : TrueDefault 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