最近对WCFRIA+MVVM+Prism有了初步的认识,能够简单的实现一些数据库的交互。这节主要讲的是Silverlight通过domainservice和ado.net实体数据模型与数据库的交互。本文的重点是与数据库的交互,包括简单的CURD,以下是实现的一些主要过程:

1.在Sql数据库中新建userinfo表,包括的字段为id,name,age.数据库创建的存储过程为:

 USE [Test]
GO /****** Object: Table [dbo].[userinfo] Script Date: 04/24/2014 15:31:56 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO SET ANSI_PADDING ON
GO CREATE TABLE [dbo].[userinfo](
[ID] [varchar](50) NOT NULL,
[name] [varchar](50) NULL,
[age] [varchar](50) NULL,
CONSTRAINT [PK_userinfo] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO

userinfo

2.新建silverlight了应用程序,并启用WcfRIA。为了简便,我没有单独兴建其他的项目。在web项目中添加model和servers两个文件夹,model文件下主要存放ado实体数据模型,services文件夹存放domainservice。在silverlight客户端需要新建ViewModel和Views文件夹,解决方案的截图如下。

这里需要注意的是,ado.net实体数据模型需要进行一定设置才能引用。一般需要删除两个后缀为.tt的文件,并在添加模型时需要启用编辑。

3.在silverlight服务端添加表userinfo的实体数据模型,并建立基于此模型的domainservice类。

   [EnableClientAccess()]
public class DomainService1 : LinqToEntitiesDomainService<TestEntities>
{ // TODO:
// 考虑约束查询方法的结果。如果需要其他输入,
//可向此方法添加参数或创建具有不同名称的其他查询方法。
// 为支持分页,需要向“userinfo”查询添加顺序。
public IQueryable<userinfo> GetUserinfo()
{
return this.ObjectContext.userinfo;
} public void InsertUserinfo(userinfo userinfo)
{
if ((userinfo.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(userinfo, EntityState.Added);
}
else
{
this.ObjectContext.userinfo.AddObject(userinfo);
}
}
public IQueryable<userinfo> GetUserByName(string name)
{
return this.ObjectContext.userinfo.Where(r=>r.name.StartsWith(name));
}
public void UpdateUserinfo(userinfo currentuserinfo)
{
this.ObjectContext.userinfo.AttachAsModified(currentuserinfo, this.ChangeSet.GetOriginal(currentuserinfo));
} public void DeleteUserinfo(userinfo userinfo)
{
if ((userinfo.EntityState != EntityState.Detached))
{
this.ObjectContext.ObjectStateManager.ChangeObjectState(userinfo, EntityState.Deleted);
}
else
{
this.ObjectContext.userinfo.Attach(userinfo);
this.ObjectContext.userinfo.DeleteObject(userinfo);
}
}
}

DomainService

4.在服务端View文件夹中建立userview silverlight的用户控件。前台代码为:

 <UserControl
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"
xmlns:vm="clr-namespace:SilverlightFamework.ViewModel"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
xmlns:Models="clr-namespace:SilverlightFamework.Web.Models"
xmlns:Services="clr-namespace:SilverlightFamework.Web.Services"
x:Class="SilverlightFamework.Views.UserView"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.DataContext>
<vm:UserViewModel/>
</UserControl.DataContext>
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="添加" Width="50" Height="25" Command="{Binding OnInsert,Mode=OneWay}" CommandParameter="{Binding Text,ElementName=textbox1}" Margin="222,0,128,5"/>
<TextBox Text="{Binding UserInfo.age,Mode=TwoWay}" Width="100" HorizontalAlignment="Left" x:Name="txtage" Height="30"></TextBox>
<TextBox Text="{Binding UserInfo.name,Mode=TwoWay}" Width="100" Margin="105,0,195,0" x:Name="txtname" Height="30"></TextBox>
<sdk:DataGrid HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top"
AutoGenerateColumns="True"
ItemsSource="{Binding UserList,Mode=TwoWay}" SelectedItem="{Binding SelectItem,Mode=TwoWay}" /> <TextBox Grid.Row="1" Width="50" Height="30" HorizontalAlignment="Left" x:Name="txtSearch"></TextBox>
<Button Grid.Row="1" Width="50" Height="30" Content="查询" Command="{Binding OnSearch,Mode=OneWay}"
CommandParameter="{Binding Text,ElementName=txtSearch}"
Margin="60,0,0,0" HorizontalAlignment="Left"></Button>
<Button Width="50" Height="30" Grid.Row="1" Margin="120,0,0,0" HorizontalAlignment="Left"
Content="删除" Command="{Binding OnDelete,Mode=OneWay}"></Button>
<Button Grid.Row="1" Width="50" Height="30" Margin="200,0,0,0" HorizontalAlignment="Left" Content="更新"></Button> </Grid>
</UserControl>

userview

这里需要讲的重点是,Silverlight的MVVM设计模式将前台代码和后台的完全分离。前台的ui只负责控件的展示,一切的事件和数据源都在前台通过绑定来实现,不需要到后台赋值。控件的绑定有三种类型:OneTime,OneWay,TwoWay.OneTime顾名思义就是一次性的绑定,对控件只能影响一次。OneWay,不是一次绑定的意思哈,它指的是单向的绑定,控件值的改变不会影响数据源。比如DataGird中,我们改动了某一个数据,但是他的数据源并没有变化,当我们再次加载的时候,它还是显示原来的数据。TwoWay是指双向绑定,控件的值发生改变,数据源也会随之发生变化。

Button控件可以绑定Command命令,不需要实现click事件,同时可以通过CommandParameter传递参数,也就是当这个命令发生的时候传递的参数。本文传递了需要查询的字段值,为控件绑定的CommandParameter="{Binding Text,ElementName=txtSearch}",也就是将txtSeatrch的值传递过去。

5.ViewModel是系统的核心部分,它连接着View以及Services,也就是连接着数据层和表现层。在ViewModel中,可以进行一些与数据库有关的操作和其他的相关操作。在ViewModel中新建UserViewModel类,代码如下:

这里,我们新建了4个命令,分别对应着数据库的曾删改查,DelegateCommand并不是自己封装的类,它引用自prism。构造函数里面的初始化很重要,因为View中的DataContext的内容直接来自于构造函数。有时候,我们会发现已经为某个属性赋值了,但是在前台并没有绑定上,问题就是出在这里。这里建议需要绑定的属性最好都能在构造函数中初始化。初始化之后,我们就可以在其他地方赋值,前台的绑定就能够实现。下面具体说说数据的加载、增加、删除、更新。

(1)数据的加载

silvertlight中Datagrid绑定的实体或者集合。我们通过domainservice提供的load方法能够获得数据表中的实体的集合。

    private IEnumerable<userinfo> userList;
public IEnumerable<userinfo> UserList
{
get
{
return userList;
}
set
{
if (value != userList)
{
userList = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("UserList"));
}
}
}
}

(2)数据的查询

数据的查询和数据的加载有相似之处,查询是有条件的加载。这里只实现单一条件的查询,当然可以扩展成为多条件的查询。需要对域服务类进行一定的扩展。

     public IEnumerable<userinfo> GetQueryList()
{
//domainservice = new DomainService1();
if (!string.IsNullOrEmpty(searchText))
{ LoadOperation<userinfo> loaduer = domainservice.Load(domainservice.GetUserByNameQuery(searchText));
return loaduer.Entities;
}
else
{
LoadOperation<userinfo> loaduers = domainservice.Load(domainservice.GetUserinfoQuery());
return loaduers.Entities;
}
}
public ICommand OnSearch { get; set; }
public void SearchData(object obj)
{
searchText = obj.ToString();
UserList= GetQueryList(); }

SearchData

值得注意的是,这里我们通过命令来调用查询方法。

(3)数据的插入

数据的插入也是通过command来实现的。

     }
public ICommand OnInsert { get; set; }
public void AddData(object obj)
{
userinfo user= new userinfo();
user.ID = Guid.NewGuid().ToString();
user.name = userInfo.name;
user.age = userInfo.age;
//domainservice = new DomainService1();
domainservice.userinfos.Add(user);
domainservice.SubmitChanges(SubmitOperation => { RefreshData(); },null);
}

InsertData

这里在插入的时候,必须新建新的userinfo,因为我们的主键是自动生成的,而主键又是只读的。若我们仍使用在构造函数中实例化的userinfo对象,则会跑出异常。一个新的对象可以解决这样的问题。在插入成功后,通过lamda表达式来为属性重新赋值,使我们添加的数据能够及时的显示。

(4)数据的更新

数据的更新比较简单,它的要求是绑定的方式必须是twowa。通过domainservice.SubmitChanges()就能实现。

    public ICommand OnUpdate { get; set; }
public void UpDateData(object obj)
{
userinfo user = this.SelectItem as userinfo;
domainservice.SubmitChanges(SubmitOperation => { RefreshData(); },null);
}

UpdateData

(5)数据的删除

数据的删除方法比较多,可以通过主键进行数据的删除,也可以通过实现进行数据的删除,本文是通过后者实现的。这里需要为DataGrid绑定selectitem,来获取我们选择行的值,在后台转换为userinfo类型。通过domainservice.userinfos.Remove(userinfo)来实现删除。

   public ICommand OnDelete { get; set; }
public void DeleteData(object obj)
{
userinfo userinfos = this.SelectItem as userinfo;
domainservice.userinfos.Remove(userinfos);
domainservice.SubmitChanges(SubmitOperation => { RefreshData(); },null);
}

OnDelete

在进行调试的时候,发现数据的增删改查并没有及时的UI中显示,后来通过重新加载的方法得意实现,不知道还有没有更好的方法。

mvvm+prim 还有很多值得学习的地方,平时自己研究的并不是太深入。大家通过项目继续学习。

Silverlight学习(三)的更多相关文章

  1. ArcGIS api fo silverlight学习三(利用ElementLayer实现鼠标悬浮弹出自定义窗体)

    接着上一节继续学习,本节主要是利用ElementLayer实现鼠标悬浮弹出自定义窗体 参考博文:http://www.cnblogs.com/luxiaoxun/p/3322218.html 一.新建 ...

  2. ArcGIS API for Silverlight学习笔记

    ArcGIS API for Silverlight学习笔记(一):为什么要用Silverlight API(转) 你用上3G手机了吗?你可能会说,我就是喜欢用nokia1100,ABCDEFG跟我都 ...

  3. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  4. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  5. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  6. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  7. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  8. [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点

    深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...

  9. SVG 学习<三>渐变

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  10. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

随机推荐

  1. x86汇编指令具体解释

    80x86指令系统 80x86指令系统,指令按功能可分为下面七个部分. (1) 数据传送指令. (2) 算术运算指令. (3) 逻辑运算指令. (4) 串操作指令. (5) 控制转移指令. (6) 处 ...

  2. 苹果试图做?XCode6 放弃prefix.pch档

    当我们升级到XCode6后, 新建project发现默认是没有pch文件的.非常多人開始不习惯了,苹果到底为什么要取消这一个pch文件. 苹果觉得,因为组件单一模块的原因.你不应该在你的prefix代 ...

  3. sharepreference实现记住password功能

        SharePreference是用于保存数据用的.主要调用Context.getSharePreferences(String name, int mode)方法来得到SharePrefere ...

  4. js的for in循环和java里的foreach循环的差别

    js里的for in循环定义例如以下: for(var variable in obj) { ... } obj能够是一个普通的js对象或者一个数组.假设obj是js对象,那么variable在遍历中 ...

  5. Html5 代码

      随着HTML5的流行,许多网站开始介绍HTML5元素和属性的用法,以及各种教程,并且越来越多老的浏览器开始兼容HTML5. 本文作者编译了10段非常实用的HTML5代码片段,开发者可以直接拿过去使 ...

  6. JDBC插入百万数据,不到5秒!

    java自带的批量操作,就可以很好的支持大量数据的处理.相比c#,简单很多.c#要使用oracle提供的ODP.NET,效率才很高,但是代码却很复杂.总之,在这方面,c#没得比.当然,这里的表是没加索 ...

  7. (Oracle EBS)和标准用户有关的处理的API [Z]

    /* 和标准用户有关的处理的API. */ ---和用户处理有关的API FND_USER_PKG ---和用户密码处理有关的API fnd_web_sec ---和用户职责处理有关的API FND_ ...

  8. EntityFramework sum嵌套

    一个查询中 用到了 sum , 可是返回结果的小数有很多位 , 都不准确了..类似js中的小数运算一样...不太熟悉C#,不知道这问题是因为double的关系 , 还是因为代码写的问题 , 通过 sq ...

  9. GPS数据处理 - 字符串函数的灵活应用

    题目内容: NMEA- 0183协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA- The National Mari ...

  10. 正确合理的建立MYSQL数据库索引

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整 ...