在Visual Studio LightSwitch 2011中引用WCF RIA Service数据源
在VSLS2011中,对已有数据类型提供了三种加载方法,一是SQL Server数据库,一种是SharePoint列表,还有一种就是WCF RIA Service,如下图:
这篇博文就说明一下怎么加载WCF RIA Service。
首先来了解一下本例的数据结构:
宠物主人表和宠物信息表,这间的关系是一对多。
打开vs2010,创建一个名称为“Pet_Service”的“WCF RIA Services类库”项目,在Pet_Service.Web项目中,添加一个“ADO.NET实体数据模型”新项,名称为“PetModel.edmx”,并且导入数据库中的Pets表和Hosters表(详细步骤可查看ADO.NET Entity Framework相关知识),然后生成一下Pet_Service项目(注意:这里必需生成一下,否则接下的步骤看不到相关实体)。然后再选择Pet_Service.Web项目,添加新项“域服务类”,命名为“Pet_DS”,在弹出的域服务类对话框中选中“公开OData终结点”,并选中上面创建的实体类,如下图:
单击“确定”,生成本项目。
在相同解决方案中创建LightSwitch项目“PetManage”,右键Data Sources,选择“Add Data Source…”,选择“WCF RIA Service”,下一步,在“Attach Data Source Wizard”中,选择“Add Reference”,选择“项目”选项卡,选择“Pet_Service.Web”项目,下一步,并选中“Entities”多选框,完成,就会自动生成两个数据源实体表“Hoster”和“Pet”。
此时,右键“Screen”,添加界面,选择“Search Data Screen”,“Screen Data”选择“Pet_DSData.Hoster”,单击OK,运行,查看效果,会发现界面与数据源是没有连接上的,查询不出任何数据,出现这种情况是因为在LightSwitch项目运行时,执行程序会读取项目文件夹下的Bin目录中Debug文件夹下的web.config文件中的WCF RIA Service数据源的连接字符串,因为这个连接字符串是在WCF RIA Service下存放,所以这个web.config下放的是<add name="Pet_Service.Web.Pet_DS" connectionString="" />,连接字符串为空,所以造成这个情况的,但如果在这里把WCF RIA Service中的连接字符串考过来,在LightSwitch项目编译时,会重置connectionString的值,会还原成空值,为了编译和生成时都能正常调试,需要在“WCF RIA Service”项目,Pet_DS.cs中添加如下代码:
protected override PetManagementEntities CreateObjectContext()
{
string constr = ConfigurationManager.ConnectionStrings["Pet_Service.Web.Pet_DS"].ConnectionString;
if (string.IsNullOrEmpty(constr))
{
EntityConnectionStringBuilder Connection = new EntityConnectionStringBuilder();
Connection.ProviderConnectionString = "data source=服务器IP;initial catalog=数据库名;user id=用户名;password=密码";
Connection.Provider = "System.Data.SqlClient";
Connection.Metadata = "res://*/PetModel.csdl|res://*/PetModel.ssdl|res://*/PetModel.msl";
return new PetManagementEntities(Connection.ToString());
}
else
{
return new PetManagementEntities(constr);
}
}
上面的代码意思如果取不到配置文件中的连接字符串,就用硬编码的字符串,这种情况适合在编译是使用,当程序发布后,添加web.config中的<add name="Pet_Service.Web.Pet_DS" connectionString="" />节点的连接字符串的值,上面的硬编码的连接字符串就不起作用了。这样,就完成了一个LightSwitch连接WCF RIA Service例子了。