在同一屏幕上关联和编辑来自多个数据源的数据
[原文发表地址] Relating and Editing Data from Multiple Data Sources on the Same Screen
[原文发表时间] 2011-07-11 08:01 AM
我在上一篇文章中展示了如何将LightSwitch和SharePoint数据相连,以便把用户的任务列表拉到你的LightSwitch应用程序中。如果你错过了,可以点击下面的链接:
在你的LightSwitch应用程序中使用SharePoint数据
在那里我们创建了一个屏幕,把SharePoint中所有登入的用户任务都罗列出来,这样他们就可以直接去修改了。我们用一个新的仅显示SharePoint数据的屏幕来实现。在这篇博文中,我想向你展示如何将SharePoint数据与储存在数据库中的数据关联起来,并且显示在一个单独的屏幕上。如果你想编辑来自多个数据源来的数据,无论是来源于SharePoint或者其他外部数据库,你都需要写几行代码。相关技术视频教学请见:我是如何:在同一屏幕上保存多数据源数据的?
跨数据源关联实体
LightSwitch最引人注目的一个功能就是可以跨不同数据源关联实体(表或清单)。比如你可以有一个产品目录数据库,仅储存产品详情,并将其关联到另一个完全独立的订单管理数据库表中。或者你也可以把储存在SharePoint的问题清单关联到另一数据库的顾客表中。在这个例子中,我就会这么做,我想把储存在SharePoint中的顾客问题和存储在我数据库中的顾客详情显示在同一屏幕中。
因此我根据SharePoint中的问题模板,设置了一个顾客问题列表。我对其进行修改,添加了额外需要的称作顾客ID的文本域。
我们会用这个来关联数据库中顾客记录。在这个例子中,我们会在LightSwitch中自动生成顾客ID,也就是GUID(全球唯一标示符)不过你可以选择使用任意跨数据源分享的域。所以我在我的LightSwitch应用程序中创建了一个顾客表,并附上以下属性:
注意在顾客ID的属性窗口,我勾选了Include in Unique Index,但未勾选Display by Default,因为我们要自动生成这个值。下拉设计器顶端的编写代码按钮,选择Customer_Created函数,编写下列代码:
1: Private Sub Customer_Created()
2: Me.CustomerID = Guid.NewGuid.ToString
3: End Sub
下面我们要连接SharePoint,并把我们的顾客问题列表关联到顾客中去。就像我在上一篇博文中写的,你可以通过右击Solution Explorer中的数据源节点(或者点击数据设计器顶端的“Attach to External Data Source”按钮),然后选择SharePoint作为数据源类型。点击下一步,指定你的SharePoint站点地址。LightSwitch会显示站点中定义的所有列表。我会选择顾客问题,然后就会自动拉入用户信息列表,因为这与顾客问题有关联。
点击完成,就会在数据设计器中显示顾客问题实体了。然后我们要设置关联到我们的顾客表。点击设计器顶端的“Relationship”按钮,并在To这一栏中选择顾客。然后你要选择下面的Foreign和Primary键值。这是我们添加的顾客ID域“Primary”,或者也可以称作顾客的唯一键值。
注意在跨数据源关联的实体间有条虚线。这就是说LightSwitch不强制引用数据的完整性,但是它可以把数据关联在一起。换句话说,我们不能禁止删除顾客,即使SharePoint仍有问题事件,但是我们可以在数据存在的情况下把它关联起来。
用多数据源创建屏幕
创建一个显示跨多数据源的屏幕其实很简单,这和你在系统中使用其他数据的步骤是一样的。点击数据设计器顶端的“Screen”按钮,或者在Solution Explorer中的屏幕节点上右击,添加一个新屏幕。在这个例子中,我使用的是列表和详情屏幕。选择顾客作为屏幕数据,包含顾客问题。
现在我们点击F5,生成并运行应用,看看目前为止我们得到了什么。在系统中创建一些新的顾客。但是注意顾客问题的框格是只读的。在这点上我们不能编辑任何SharePoint数据,注意那些添加,编辑和删除按钮是无效的。
为什么会这样呢?因为LightSwitch需要我们提供更多的信息来妥善保存数据。尤其是,它需要知道数据储存的顺序。LightSwitch不会随意地选用一种顺序,因为在大部分系统中顺序是很重要的。在我们的例子中,我要确定在SharePoint中保存其他任何问题之前顾客数据已经成功保存了。
启动编辑多数据源数据
我们要做的就是编写几行代码。关闭应用,回到我们创建的顾客列表详情视窗。下拉编写代码按钮,选择CustomerListDetail_InitializeDataWorkspace和CustomerListDetail_Saving函数,来创建存根。在InitializeDataWorkspace函数中,你要注意一个参数saveChangesTo。这个参数是用来告诉屏幕可以编辑数据的,我们要向列表中添加我们要合作的数据源。然后在Saving函数中我们要指定更改的保存顺序。使用DataWorkspace对象,就能够访问数据源了。
1: Public Class CustomersListDetail Private Sub CustomersListDetail_InitializeDataWorkspace(
2: saveChangesTo As System.Collections.Generic.List(Of Microsoft.LightSwitch.IDataService))
3:
4: saveChangesTo.Add(Me.DataWorkspace.ApplicationData)
5: saveChangesTo.Add(Me.DataWorkspace.Team_SiteData)
6: End Sub
7:
8: Private Sub CustomersListDetail_Saving(ByRef handled As Boolean)
9: Me.DataWorkspace.ApplicationData.SaveChanges()
10: Me.DataWorkspace.Team_SiteData.SaveChanges()
11: handled = True
12: End Sub
13: End Class
现在再次运行应用程序,这次你可以添加,编辑和删除顾客问题并保存到SharePoint了。如果你想在SharePoint中看一下,你会发现LightSwitch根据关系自动为我们设置了CustomerID。
顺便说一句,这个方法不仅适用于SharePoint。你还可以关联像数据库这样的其他外部数据源的数据,并且在单一屏幕中保存他们,当然也需要添加相同的代码。LightSwitch为我们挑起几乎所有的重担,但在这个例子中有一点也很重要,那就是明确数据如何更新并且最终能在任意情况下准确无误地保存。
希望你们喜欢!