在同一屏幕上关联和编辑来自多个数据源的数据

[原文发表地址] 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的文本域。

clip_image002

我们会用这个来关联数据库中顾客记录。在这个例子中,我们会在LightSwitch中自动生成顾客ID,也就是GUID(全球唯一标示符)不过你可以选择使用任意跨数据源分享的域。所以我在我的LightSwitch应用程序中创建了一个顾客表,并附上以下属性:

clip_image004

注意在顾客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会显示站点中定义的所有列表。我会选择顾客问题,然后就会自动拉入用户信息列表,因为这与顾客问题有关联。

clip_image006

点击完成,就会在数据设计器中显示顾客问题实体了。然后我们要设置关联到我们的顾客表。点击设计器顶端的“Relationship”按钮,并在To这一栏中选择顾客。然后你要选择下面的Foreign和Primary键值。这是我们添加的顾客ID域“Primary”,或者也可以称作顾客的唯一键值。

clip_image008

注意在跨数据源关联的实体间有条虚线。这就是说LightSwitch不强制引用数据的完整性,但是它可以把数据关联在一起。换句话说,我们不能禁止删除顾客,即使SharePoint仍有问题事件,但是我们可以在数据存在的情况下把它关联起来。

用多数据源创建屏幕

创建一个显示跨多数据源的屏幕其实很简单,这和你在系统中使用其他数据的步骤是一样的。点击数据设计器顶端的“Screen”按钮,或者在Solution Explorer中的屏幕节点上右击,添加一个新屏幕。在这个例子中,我使用的是列表和详情屏幕。选择顾客作为屏幕数据,包含顾客问题。

clip_image010

现在我们点击F5,生成并运行应用,看看目前为止我们得到了什么。在系统中创建一些新的顾客。但是注意顾客问题的框格是只读的。在这点上我们不能编辑任何SharePoint数据,注意那些添加,编辑和删除按钮是无效的。

clip_image012

为什么会这样呢?因为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。

clip_image014

顺便说一句,这个方法不仅适用于SharePoint。你还可以关联像数据库这样的其他外部数据源的数据,并且在单一屏幕中保存他们,当然也需要添加相同的代码。LightSwitch为我们挑起几乎所有的重担,但在这个例子中有一点也很重要,那就是明确数据如何更新并且最终能在任意情况下准确无误地保存。

希望你们喜欢!