开始VS 2012 中LightSwitch系列的第2部分:感受关爱——定义数据关系

[原文发表地址]  Beginning LightSwitch in VS 2012 Part 2: Feel the Love - Defining Data Relationships

[原文发表时间] 2012-08-15 18:01

说明:本文是将之前所编的Visual Studio LightSwitch 2011 博文更新到Visual Studio 2012 中的LightSwitch 若要查看原文版本,请点击这里

欢迎来到 开始Visual Studio 2012中LightSwitch系列 的第2部分。在上一篇博文中,我们了解了表或实体,以及在LightSwitch中如何使用数据设计器来定义它们。如果您错过了,可以从这里查看: 开始Visual Studio 2012 中LightSwitch第1部分:表中有什么?描述你的数据

在本篇博文中,我想要关注在第一部分中建立的数据模型之间的数据关系。关系定义了数据库中一个表中的信息是如何与另一个表中的信息相对应的。或更广义来讲,关系定义了在(或跨)数据源中一个实体如何与另一个实体相对应。您可以将实体之间的关系想象为日常生活中的事物之间的关系。例如,学校与学生之间的关系是一个存在于现实世界中的关系。同样,学生和学生就读的课程之间存在一个真实的关系。在数据模型中,您可能需要一个实体包含学生,以及另一个实体包含他们就读的课程。当您将这两个实体联系在一起时,就创建了一个关系。

创建一个更好的通讯簿

在我们开始的 1 部分的示例中,我们建立了一个管理联系人的地址簿应用程序。在我们当前的数据模型中,我们只为联系人存储一个电话号码、一个电子邮件地址和一个地址。

image

然而,在现实生活中,联系人通常有多个电子邮件、 电话号码和地址信息。为了在LightSwitch 中建立的数据库中示范这一点,我们需要定义其他表,并将它们与联系人表关联为一个一对多的关系。一对多关系可能是定义关系中最常见的类型。在我们的例子中,这意味着一个联系人可以有个电子邮件地址。一个联系人可以有很多的电话号码。一个联系人也可以有许多的物理地址。

让我们从电子邮件地址开始。如果我们想要收集联系人的多个电子邮件地址,我们有几个选择。一个选择是将固定数量的电子邮件属性以Email1、 Email 2、 Email3 的形式添加到联系人中。这意味着对于任何给定的联系人,我们永远不能收集超过 3 个的电子邮件地址。取决于您所构建的应用程序的类型,这可能已经很好了。但是,如果您以相同的方式(此例中的电子邮件)添加太多的属性到表中,那么是时候思考不同的策略了。取而代之的,我们应创建一个EmailAddress表,并定义一个一对多的关系。

在数据设计器中,单击“New Table”按钮,将实体定义为EmailAddress,并添加两个必需的属性:Email(Email Address类型) 和 EmailType (String类型)。

image

对于EmailType,我们将创建一个Choice List(选择列表),您在该系列的第1 部分中已经学到它了。此属性将捕获电子邮件的类型,不管是个人还是工作的。我也选择让它的最大长度只有 25 个字符— — 我们永远不需要所有 的255个字符。

image

为什么我们不将最大长度设为 8 个字符呢,它是choice list中的最大长度?因为如果我们以后需要添加值到选择列表中,如果值超过了 8 个字符,那么我们不会不得不更改数据模型。如今磁盘空间很便宜,所以最好使用较长的最大长度,那样所有数据都可以存在基础表中,这样就避免了经常更改数据模型。

LightSwitch 中定义关系

既然我们已经建好了EmailAddress实体,是时候来定义关系了。单击数据设计器顶部的"Relationship…"按钮,这将打开“Add New Relationship”对话框窗口。在"To"列中选择联系人来设置一对多关系。默认情况下,多重性被设置为了多对一,所以我们不需要去改变它。多重性定义了您想要在 LightSwitch中创建的关系类型,您还可以将多重性指定为一到零或一,这就是说最多只能允许一个相关实体。

有关定义不同类型的关系的详细信息,请参阅:如何: 定义数据关系

有关如何在 LightSwitch中 构建多对多关系的信息,请参阅:如何创建多对多关系

您还可以指定当删除一个联系人后,电子邮件地址做何反应。默认情况下,它被设置为"受限"。这意味着如果他们有任何电子邮件地址的话,不允许用户删除此联系人。如果我们的客户下了多个订单,保留该设置是有意义的。举个例子,但不是在这个案例中。当我们删除联系人时,我们想要 LightSwitch 自动删除任何电子邮件地址,所以设置为"删除行为"与"级联删除"的效果是一样的。

image

对话框中的底部说明将帮助您了解在设置关系时所做的事情。一旦单击OK后,您将在数据设计器中看到关系,它显示了正在使用的实体之间的所有直接关系。请注意联系人属性现在被添加到了EmailAddress实体中。这称为导航属性,表示联系人属于哪个EmailAddress。

image

双击联系人实体来将其打开,您会发现,该联系人有一个导航属性,可以用来获取所有的电子邮件地址。导航属性是由 LightSwitch 在屏幕上使用,以此来浏览您的数据,所以请务必正确建模。

既然我们已经定义了EmailAddress表,并设置了关系,现在我们需要删除之前在联系人表中定义的电子邮件属性。选择电子邮件属性,并按Delete 键。或者右击,然后选择Delete菜单。同样,删掉Address1、Address2、 City、 State、 ZIP 和Phone属性。

image

接下来,让我们以添加EmailAddress表的相同方式添加一个PhoneNumber表。您可能想知道为什么我们要创建一个新表来与EmailAddress相区分。这是因为电子邮件和电话号码是联系人的不同方面,它们除了通过联系人之外,彼此并无任何关系。因此,我们需要创建一个新表。

单击“Add Table”按钮,并为PhoneNumber实体定义两个必需的属性: Phone(Phone Number类型) 和 PhoneType (String 类型)。PhoneType 将会有一个包含“Cell”, “Fax”, “Home”, 和Work”的Choice List。

image

下一步,以之前完全相同的方式添加关系到联系人表中。当显示PhoneNumber实体时,单击数据设计器顶部的"Relationship…"按钮,并指定与联系人表之间的关系。

image

最后但也重要的是,我们需要创建一个Address表来存储联系人的多个物理地址。单击Add Table按钮,并为Address实体定义以下属性 :AddressType、Address1、Address2、City、State、ZIP。将 AddressType 和Address1属性设置为必需的。我们还要为AddressType属性指定一个包含了“Home”、“Work”、 和“Other”的Choice List。

image

现在,和之前完全一样,为Address表设置关系。当Address实体显示时,则单击"Relationship…"按钮并指定其于联系人表之间的关系。我们再次选择"级联删除",那样如果删除了一个联系人,则其任何地址将被自动删除。这对于联系人来说是有意义的,因为如果用户从系统中删除了该联系人,其所有的信息应被自动删除。请牢记,但是,您可能不希望在其他应用程序中使用这种行为。例如,如果构建一个订单输入应用程序,如果客户在系统中有任何订单,您想要限制删除客户的行为来保持完好无损的订单历史记录。

image

现在,当我们在数据设计器中打开联系人的实体时,可以看到所有的直接关系。

image

测试地址簿

既然我们已设计好了数据模型,让我们通过创建一个屏幕来快速测试它吧。单击数据设计器顶部的“Screen…”按钮来打开Add New Screen对话框。在以后的博文中,我们将讨论更多关于屏幕的事情,但现在只是选择List and Details界面。然后在Screen Data下拉菜单中选择联系人。一旦这样做了,您将看到我们创建的其他相关联实体的复选框。全部选择并单击OK。

image

想要构建和启动应用程序,就按F5 现在,您可以使用此屏幕输入信息。单击左侧列表框顶部的"+"按钮来添加新的联系人。

image

请注意 LightSwitch 可以读取我们在数据模型中设置的所有一对多关系,并且联系人的详细信息下面为电子邮件地址、电话号码和地址创建一个正如我们所期望的网格状的表格区域。在默认情况下网格是可以编辑的,因此您可以将相关的数据直接输入道行中。

因为我们在数据模型中合理地定义了关系,所以LightSwitch能够创建一个非常实用的屏幕来让我们毫不费力地将数据输入到数据库中的所有表中。在下一篇博文中,我们将会深入探讨屏幕模板以及如何自定义屏幕布局。下一次再见 !

希望大家喜欢!