学习过程真的很悲剧啊!唉!这点东西折腾了我好几天。不过,最终还算不错,弄出来了,继续努力。
开发工具:VS2012+silverlight5。
第一步:通过依次选择“文件”、“新建”和“项目”,在 Visual Studio 2010 中创建新的 RIA Services 项目。此时将出现“新建项目”对话框。如下图:
第二部:单击“确定”。此时将出现“新建 Silverlight 应用程序”对话框。
单击“确定”创建解决方案。该解决方案包含两个项目:一个客户端项目和一个服务器项目。客户端项目名为 SL,它包含用于创建表示层的 Silverlight 代码。服务器项目名为 SL.Web,它包含中间层代码。
(1)、如果不启用wcf RIA 服务,选中客户端项目SL,点击资源管理器 工具栏选项中的显示所有文件按钮,结果如下:
右键客户端项目SL,选择属性,结果如下:
(2)、如果启用wcf RIA 服务,在服务器端项目SL.Web添加ASP.NET实体数据模型后,生成解决方案,选中客户端项目SL,点击资源管理器 工具栏选项中的显示所有文件按钮,结果如下:
右键客户端项目SL,选择属性,结果如下:
本例选择启用WCF RIA 服务。
第三部:添加ASP.NET实体数据模型。
(1)、选中服务器端项目SL.Web,右键添加-->新建项,如下图:
这里更名:GoodsContract.edmx。
(2)、单击添加按钮。如下图:
(3)、单击下一步按钮,如下图:
点击新建连接(C)... ,如下图:
数据源选择“Microsoft SQL Server” ,点击 继续,选择数据库服务器(这里是本地),选择要使用的数据库,测试连接,如下图:
单击确定按钮,如下图:
注:如果在添加ASP.NEt实体数据模型前,在服务器资源管理器中添加了所需要的数据库,那么第三部的(3)中图将是上面的这张有涂鸦的图。
单击下一步,如下图:
选择所需的表,点击完成,如下图:
如果你现在点击*.Designer.cs文件,如下图:
这里是没有自动生成的代码的。这里我们需要设置一下,打开*.edmx 文件,单击空白处,查看属性,如下图:
修改属性窗口中的“代码生成策略”选项,改为“默认值”。我们再次查看*.Designer.cs文件,如下如图:
此时自动生成的代码默认是有问题的,这个问题我们下面再说(删除两个*.tt文件,就可以解决了)。
第四部:添加域服务类。
如果上一部最后的问题没有解决,这时候添加域服务类是有问题的,如下图:
此时没有可选的可选的上下文类,同时也没有实体。怎么解决?这里和上面自动生成的代码有问题是一个原因导致的,删除两个*.tt文件,就可以了。
如果这样是不可以,那么你就编译一下项目,就可以。如下图:
这里域服务类命名为DomainService_GoodsContract, 选择唯一的实体并启用编辑,点击确定按钮,如下图:
默认会生成四个方法,分别是:查询、插入、更新和删除。“Ctrl+shift+B”生成解决方案,客户端项目SL会有变化,如下图:
第五部:打开MainPage.xaml文件,拖入一个DataGrid控件,如下图:
最后,添加后台代码。按“F7”跳到代码页,添加using SL.Web;还有一个:using System.ServiceModel.DomainServices.Client;这两个引用,如下图:
终于完工了。启动调试,如下图:
唉! 写到这里我真的很郁闷,开始我自己做的时候,后台代码:
<p>public partial class MainPage : UserControl
{
private DomainService_GoodsContract client = new DomainService_GoodsContract();
public MainPage()
{
InitializeComponent();</p><p> LoadOperation<GoodsContract> loadOp = client.Load(client.GetGoodsContractQuery());
DataGrid1.ItemsSource = loadOp.Entities;
}
}</p>
像这样写根本出不来结果,我都快崩溃了,强烈怀疑官方的演练。最后我是这样写的,就成功了:
public partial class MainPage : UserControl
{
private DomainService_GoodsContract client = new DomainService_GoodsContract();
public MainPage()
{
InitializeComponent();
Get();
}
void Get()
{
LoadOperation<GoodsContract> loadOp = client.Load(client.GetGoodsContractQuery());
DataGrid1.ItemsSource = loadOp.Entities;
}
}
我是真的没有明白这两种写法之间有何不同!如果有大神明白,还请赐教,不胜感激。
还有一种方式也成功了,DataGrid控件添加Loaded事件,代码如下:
<Grid x:Name="LayoutRoot" Background="White">
<sdk:DataGrid x:Name="DataGrid1" Loaded="DataGrid1_Loaded_1" />
</Grid>
后台代码:
<p>public partial class MainPage : UserControl
{
private DomainService_GoodsContract client = new DomainService_GoodsContract();
public MainPage()
{
InitializeComponent();
LoadOperation<GoodsContract> loadOp = client.Load(client.GetGoodsContractQuery());
DataGrid1.ItemsSource = loadOp.Entities;
}</p><p> private void DataGrid1_Loaded_1(object sender, RoutedEventArgs e)
{</p><p> }
}</p>
现在这三种方式都成功了!我晕了!如果有明白的请指点一二,谢谢。