初来51CTO,以后会为大家带来SilverLight开发系列文章,本系列就已简睿科技正在开发的一套销售系统为大家讲解SilverLight使用WRS(WCF RIA SERVICE)进行和数据库之间的交互。 随着SL4的到来微软发布了一套新的数据库交互技术WRS,当然大家也可以继续使用WCF进行数据交互,相比之下,WRS操作更加简便,省去了大家认为最头疼的WCF配置。

        需要使用的工具:VS2010,SQL SERVER 2008 R2

        那我们现在就开始WRS的开发之旅,这节主要实现一个简单的登录模块。

        1.拿出SQL SERVER 2008 R2,新建数据库,我这里名称为janerui,然后建立表UserInfo,字段信息见下图,其中UserID为自增长列,并且为主键,这里要提醒大家,如果要对表进行修改就必须定义主键,不然会报错:

        2.表建立完毕,我们随便输入几条数据:

        3.接下来我们打开VS2010,新建项目:文件/新建项目/SilverLight/Silverlight应用程序,解放方案名称我这里命名为"janerui",确定后在对话窗中勾选上“启用WCF RIA SERVICE服务”,完成后我们就可以在解决方案资源管理器里看到如下图所示文件目录:

 

        上图的index.aspx是我改名的默认文件,方便让外网测试,看个人习惯,不影响后面的步骤。

        4.现在就要开始实现WRS的服务端,我们在janerui.Web项目上右键/添加/新建项/数据/ADO.NET实体数据模型,我这里命名为"jredm.edmx",确定后在弹出的窗口里选择“从数据库生成”,如果以前用过edm或者在服务器资源管理器里连接过数据库,连接字符串就会出心在下拉框中,如果没有所需要的,可以点击“新建连接”,如下图:

        确定后就会回到先前窗口,我们勾选上“是,在连接字符串中包括敏感字符”,方便我们自行更改数据库连接。

       下一步我们就来到数据库选择界面,勾选需要用到的数据库表后单击完成,其他的保持默认。

        5.接下来生成解决方案,在解决方案'janerui'上右键/重新生成解决方案。然后,在janerui.Web项目右键/添加/新建项/Web/域服务类(没有打VS SP1补丁的可能叫"DomainService"),我这里命名为“jrService.cs”,确定后我们会看到DomainService对话窗,如下图勾选:

        确定后,我们打开“jrService.metadata.cs”就会看到DomainService就会为我们生成操作UserInfo表所用到的函数,查询基本都是使用LINQ,这里的内容可以自己添加修改。

       完成后,重新生成解决方案。

       我们选中janerui项目,单击解决方案资源管理器里“显示所有文件”图标,我们会看到多出一个Generated_Code文件夹,以及下面的janerui.Web.g.cs文件,这个文件就是WRS的代理文件,可以在这里面找到代理类。

        6.我这里做了一个简单的登录界面,比较简陋,后面我们会美化界面,先让大家的眼睛受下折磨吧...

       

 
  
  1. <Grid x:Name="LayoutRoot" Background="White"> 
  2.         <Grid Width="200" Height="60"> 
  3.             <Grid.RowDefinitions> 
  4.                 <RowDefinition Height="*"/> 
  5.                 <RowDefinition Height="*"/> 
  6.                 <RowDefinition Height="*"/> 
  7.             </Grid.RowDefinitions> 
  8.             <Grid.ColumnDefinitions> 
  9.                 <ColumnDefinition Width="*"/> 
  10.                 <ColumnDefinition Width="*"/> 
  11.             </Grid.ColumnDefinitions> 
  12.             <TextBlock Grid.Row="0" Grid.Column="0" Text="用户名"/> 
  13.             <TextBox x:Name="TbUserName" Grid.Row="0" Grid.Column="1"/> 
  14.             <TextBlock Grid.Row="1" Grid.Column="0" Text="密码"/> 
  15.             <TextBox x:Name="TbUserPass" Grid.Row="1" Grid.Column="1"/> 
  16.             <Button x:Name="BtLogin" Content="登录" Grid.Row="2" Grid.ColumnSpan="2" Click="BtLogin_Click"/> 
  17.         </Grid> 
  18.     </Grid> 

        7. 定义登录按钮的单击事件,我们打开MainPage.xaml.cs文件,代码如下:

 

 
  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Windows;  
  6. using System.Windows.Controls;  
  7. using System.Windows.Documents;  
  8. using System.Windows.Input;  
  9. using System.Windows.Media;  
  10. using System.Windows.Media.Animation;  
  11. using System.Windows.Shapes;  
  12. using janerui.Web;  
  13.  
  14. namespace janerui  
  15. {  
  16.     public partial class MainPage : UserControl  
  17.     {  
  18.         jrContext Prox = new jrContext();//初始化代理类  
  19.  
  20.         public MainPage()  
  21.         {  
  22.             InitializeComponent();  
  23.         }  
  24.  
  25.         private void BtLogin_Click(object sender, RoutedEventArgs e)  
  26.         {  
  27.             //查询UserInfo表,这个GetUserInfo在jrService.metadata.cs文件里定义,这里声明它的查询完成事件  
  28.             Prox.Load(Prox.GetUserInfoQuery()).Completed += new EventHandler(GetUserInfoQuery_Completed);  
  29.         }  
  30.  
  31.         void GetUserInfoQuery_Completed(object sender, EventArgs e)  
  32.         {  
  33.             //查询完成后,代理类的上下文中UserInfos集合就会有值,我们就可以利用Linq查找是否存在此用户名和密码对应的项  
  34.             if (Prox.UserInfos.Where(f => f.UserName == TbUserName.Text & f.UserPass == TbUserPass.Text).Count() > 0)  
  35.             {  
  36.                 MessageBox.Show("登录成功");  
  37.             }  
  38.             else 
  39.             {  
  40.                 MessageBox.Show("登录失败");  
  41.             }  
  42.         }  
  43.     }  
  44. }  

         这里定义了代理类Prox,在Prox里存在每个表抽象成类后的集合,查询万数据后此集合中就会存在值,比如UserInfo,对应的集合就是Prox.UserInfos,我们就可以在客户端使用LINQ筛选所需要的数据。

        好了,这节就聊到这里,有不懂的朋友可以留言,我们尽快回复,希望文章可以为大家学习SilverLight少走些弯路。

        本文谢绝转载,谢谢您的赏识,但是转载后的文章我没办法为有问题的朋友及时回复,谢谢!