SilvelLight利用ADO.NET和WCF RIA Service 与数据库交互

概览

这个例子将为我们展示如下的功能:

1)使用DataForm实现数据的输入,并在对应的数据库表中生成对应行。

2)将后台数据库将得到的相关数据传回至DataGrid,并利用DataGrid对数据进行操作。

 

准备工作

为了能使用DataForm完成对用户信息的输入功能,需要在程序中添加对System.Windows.Controls.Data.DataForm.Toolkit的引用,安装Toolkit安装包。

下载地址:

http://silverlight.codeplex.com/releases/view/36060

 

 

创建项目

点击菜单文件-->新建-->项目..打开新建项目对话框,选择已安装模板中C#下的Silverlight中的Silverlight应用程序,输入项目名为DataBaseTest,点击OK按钮,完成创建。(在弹出的窗口中需要将“启用WCF RIA 服务”打勾)


 


创建ADO.NET Entity数据库实体模型

右键点击DataBaseTest.Web,添加—>新建项..选择数据模板下的ADO.NET实体数据模型,输入模型名称UsersModel,点击添加,选择从数据库生成,选择需要连接的数据库,选择需要包括的表和视图,点击“完成”完成添加。




 

创建Domain Service

    右键点击DataBaseTest.Web,添加—>新建项..选择Web模板下的Domain Service Class,输入名称为UsersService.cs,点击“添加”,“OK”。(找不到对应的数据库实体,重新生成一遍解决方案即可)

 


 

添加元数据验证

    打开UsersService.metadata.cs文件,修改属性声明段如下:

 

            [Editable(true)]

            [Required(ErrorMessage ="姓名不能为空")]

            [Display(Name = "请输入姓名:")]

            publicstring Name {get;set; }

 

            [Required(ErrorMessage ="年龄不能为空")]

            [Display(Name = "请输入年龄:")]

            publicint Age {get; set; }

 

            [Required(ErrorMessage ="地址不能为空")]

            [Display(Name = "请输入地址:")]

            [StringLength(40, ErrorMessage ="地址过长")]

            publicstring Location {get;set; }

 

            [Required(ErrorMessage ="性别不能为空")]

            [Display(Name= "请输入性别,填写")]

            publicstring Sex {get;set; }

 

创建Silverlight界面及组件代码

    在创建Silverlight前需重新生成解决方案(编译器会在客户端中自动生成Web服务的对应类),并添加对System.Windows.Controls.Data.DataForm.Toolkit(右击DataBaseTest下的“引用” ,选择“添加引用”,“System.Windows.Controls.Data.DataForm.Toolkit”,“确定”)。

XAML界面代码:

<UserControl x:Class="DataBaseTest.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DesignHeight="300" d:DesignWidth="880"

 xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"

xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

 

    <Grid x:Name="LayoutRoot" Background="White">

        <Grid.ColumnDefinitions>

            <ColumnDefinition />

            <ColumnDefinition />

        </Grid.ColumnDefinitions>

        <toolkit:DataForm Height="196"HorizontalAlignment="Left" Margin="12,30,0,0" Name="dataForm1" VerticalAlignment="Top" Width="415" CommandButtonsVisibility="None" />

        <sdk:DataGrid AutoGenerateColumns="True" Grid.Column="1" Height="196" Width="415" Margin="8,30,12,0" Name="dataGrid1"VerticalAlignment="Top" />

        <Button Content="提交" Height="23" HorizontalAlignment="Left" Margin="352,232,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="FormButton_Click" />

        <Button Content="修改" Grid.Column="1"Height="23" HorizontalAlignment="Left" Margin="353,232,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="GridButton_Click"/>

    </Grid>

</UserControl>

 

要点:1.添加toolkit命名空间的引用xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"

      2.将DataForm的CommmandButtonsVisibility设为None,隐藏cancel按钮.

      3.将DataGrid的AutoGenerateColumns属性设为True,以自动生成对应列.

 

后台.cs文件代码:

using System;

usingSystem.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

usingSystem.Windows.Controls;

usingSystem.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

usingSystem.Windows.Media.Animation;

using System.Windows.Shapes;

usingSystem.ServiceModel.DomainServices.Client;

using DataBaseTest.Web;

 

namespace DataBaseTest

{

    publicpartialclass MainPage :UserControl

    {

        publicUsersContext usersContext =new UsersContext(); //创建domain service服务类

        publicUsers users =newUsers();                          //创建Users,由数据模型生成,对应数据库中的Users

 

        publicMainPage()

        {

            InitializeComponent();

            dataForm1.CurrentItem =users;                      //绑定usersDataForm

 

            usersContext.Load<Users>(usersContext.GetUsersQuery());    //加载数据项到EntitySet

            dataGrid1.ItemsSource =usersContext.Users;                        //绑定数据到DataGrid

        }

 

        privatevoid FormButton_Click(objectsender,RoutedEventArgs e)

        {

            UsersnewUser = new Users();                                          //生成新用户

            newUser.Name =users.Name;

            newUser.Age = users.Age;

            newUser.Sex = users.Sex;

            newUser.Location =users.Location;

 

            usersContext.Load<Users>(usersContext.GetUsersQuery());  

           usersContext.Users.Add(newUser);                                    //添加新用户

           usersContext.SubmitChanges();                                       //提交更改

        }

 

        privatevoid GridButton_Click(objectsender,RoutedEventArgs e)

        {

           usersContext.SubmitChanges();                                   //提交更改

        }

    }

}

 

要点:1.在DomianContext类中有一个GetUsersQuery()的方法,这个方法对应于DomianService的查询方法,但调用这个方法并不能直接得到数据,这个方法获得的只是一个查询实例,不会返回具体数据。

     2. DomainContext获取数据就是通过Load方法,将数据填充到这个EntitySet属性里,然后我们的数据空间就通过绑定这个EntitySet来显示数据。而Load方法需要一个参数,这个参数就是要点1中提到的查询实例(EntityQuery)

       3. 由于DomianContext是用于SL的,SL是客户端的,所以不提供直接操作数据的方法给DomianContext,避免开发者忽略了数据传输频繁读取数据库的问题。因此我们对数据的操作基本上都是在EntitySet上完成的,不过此时的操作是在客户端的内存中的,并没有改变数据库,因此我们还需要利用DomainContext提供的SubmitChanges()方法,将所有的数据变化都同步到数据库中,



运行效果



 

总结

RIAService总体可以分为以下几个部分

  1、ADO.NET数据实体模型:这是数据对象,是实际的数据库对象的一个模型对象,操作他就相当于操作真实的数据库。当然,模型的组成部分在建立的时候是可以自己设置的。

  2、DomainService类:该类在创建时,设置对数据模型的操作方式及与客户端的关心,自动生成数据操作的添加、删除、修改、查询方法,同时也可以自定义自己的方法或函数。

  3、DomainContext类:这个是在创建好DomainService类后,Silverlight项目自动生成的类,当然这个类的名字空间是在对应的RIAService所在的项目的名字空间内。数据模型和DomainService建立好以后,在SL上最需要关注的就是DomainContext类了,因为今后的操作和数据获取都是由它所完成的,DomainService仅是做一个默默的数据提供者。这个类也类似于WCF中生成的代理类。

  4、(Entity)类:SL除了自动生成相应的DomainContext类外,还会自动生成一个数据项的类,这个类对应于数据模型的单元数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值