概览
这个例子将为我们展示如下的功能:
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; //绑定users到DataForm
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类外,还会自动生成一个数据项的类,这个类对应于数据模型的单元数据。