VS2013 LightSwitch 入门第2部分:定义数据关系

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

[原文发表时间] 2013-10-23

注意:这是LightSwitch入门系列中关于Visual Studio 2013的更新。之前的版本请阅读:


欢迎阅读 Visual Studio 2013 LightSwitch入门系列 的第2部分!之前的帖子中我们了解了LightSwitch中的实体,及如何使用数据设计器来定义它们。如果你错过了:

Beginning LightSwitch in VS 2013 Part 1: What’s in a Table? Describing Your Data

在本文中,基于第1部分建立的数据模型,我希望把重点放在数据关系上。关系定义了数据库中一个表中的信息如何响应与另一个表中的信息。更通俗来说,关系定义实体在一个数据源(或跨数据源)中如何响应另一个实体。你可以把实体之间的关系想象成在日常生活中物体之间的关系。例如,一所学校和学生之间的关系是现实世界中存在的一个关系。同样,一个真实世界存在学生与他们的班级之间的关系。在数据模型中,您可以定义一个实体包含学生,另一个实体包含他们的班级。当你把这两个实体联系在一起,你就创建了一个关系。

创建更好的通讯录

第1部分的实例中,我们建立了管理联系人的通讯录应用。在我们当前的数据模型中,我们只存储了联系人的一个电话号码、一个邮件地址和一个住址。

然而在现实生活中,联系人基本上不止包含这些信息。为了在数据库中为它建立模型,我们使用LightSwitch。我们需要定义额外的表,并且以一对多的关系将这些表与联系人相关联。一对多的关系应该最常被定义的关系模型。在我们的实例中,它代表一个联系人可以拥有多个邮件地址、多个电话号码多个住址。

让我们从邮件地址开始。如果要为我们的联系人添加多个邮件地址,我们有几个选择。 一个选择是在联系人中添加固定个数的邮件地址属性,像Email1, Email2, Email3。这就意味着你不能添加超过3个邮件地址。如果仅考虑这个应用的本身类型貌似是不错的。但是如果你要在表中添加大量同样意义的属性(这里指的是邮件地址),那就需要思考下其他方法了。我们可以换为创建一个邮件地址的表,并定义一对多的关系。

在数据设计器中,点击“新建表”按钮,定义一个EmailAddress 的实例,他有两个必要属性:Email(EmailAddress类型)和EmailType(String类型)。

image

我们为EmailType创建一个可选列表, 该系列第1部分中学到过。这个属性会捕捉邮件地址的类型,是私人的还是工作上的。我会选择最大长度是255个字节 – 我们从来用不到255个字节。

image

为什么不将最大长度设为8个字节,和可选列表中的值一样?因为如果我们要将一个值加入可选列表,它必须比8个字节长,这样我们就不必改变数据模型。硬盘空间不贵所以还是偏向于选择较长的最大长度来适应底层的表。这样可以避免频繁的改变数据模型。

用LightSwitch定义关系

既然已经有了EmailAddress实体,我们就开始定义关系吧。在数据设计器的顶端点击“关系…”按钮,会弹出“添加新关系”对话框。在“To”一栏中选择联系人来建立一对多的关系。”多样性”默认就是多对一,所以不需要改变它。”多样性”定义你创建的关系的类型。在LightSwitch中,你还可以指定多样性是一对多,或者只允许某个相关实体的最大值。

了解更多关于定义不同类型关系的内容,请查看:How to: Define Data Relationships

了解更多关于如何在LightSwitch中建立多对多关系的模型, 请查看:How to Create a Many-to-Many Relationship

你也可以指定,当联系人被删除时,对应邮件地址会如何。默认情况下,它会被设为”限制的”。这就是说拥有任何邮件地址的联系人是不能被删除的。如果我们的客户他有很多订单,那么这样是合理的,但不适用我们现在这个情况。我们希望删除联系人时LightSwitch会自动删除邮件地址, 所以将“当被删除时采取”选为“联级删除”。

image

对话框底部的描述能帮助你了解当你设置关系时会做哪些操作。点击”OK”就能在数据设计器中看到关系图,它会显示这个这个实体所有的关系。注意,现在Contact属性已经添加到了EmailAddress实体。这叫做导览属性,表示EmailAddress属于Contact。

image

双击打开Contact实体,你会看到Contact的EmailAddresses导览属性。在LightSwitch中导览属性会在屏幕上显示导向的数据,所以正确建立它们的模型是很重要的。

现在已经定义好了EmailAddress表并建好了关系,我们需要删除之前在Contact表中定义的Email属性。选择Email属性点击删除键。或者你可以右击在菜单中选择删除。同时还需要删除Address1、Address2、City、State、ZIP和Phone 属性。

image

接下来照着添加EmailAddress的方式添加PhoneNumber表。你也许想知道为何不将PhoneNumber添加在EmailAddress里。这是因为EmailAddress和PhoneNumber是联系人的不同方面,他们之间除了联系人没有其他的关系。因此,我们需要添加一个新的表。

点击”添加表”按钮,定义PhoneNumber实体和两个必要属性:Phone(电话号码类型)和PhoneType(String类型)。PhoneType有一个可选列表,“Cell”、“Fax”、“Home”和”Work”。

image

接下来像之前那样添加关系。当PhoneNumber显示后,在数据设计器顶端点击“关系…”按钮,指定与Contact表的关系。

image

最后,我们需要为Contact创建Address表来存储多个住址。点击添加表按钮并创建具有以下属性的Address实体:AddressType、Address1、Address2、City、State、ZIP。AddressType和Address1设为必要属性。我们可以为AddressType属性创建可选列表:“Home”、“Work”和“Other”。

image

现在为Address建立关系。当Address显示后,点击“关系…”按钮并指定与Contact表的关系。我们再次选择“联级删除”这样任何住址都能被自动删除。当前情况下这样的选择很合理,因为当用户删除一个联系人时,他的所有信息就应该被自动删除。记住,也许在其他应用程序中不需要这样的设定。比如,当建立订单录入应用程序时,你会希望限制客户的删除操作如果他们在系统中有任何订单的话,这样就可以保存订单历史。

image

现在我们在数据设计器中打开Contact实体,你会看到它所有直接的关系。

image

通讯录测试

现在我们设计好了数据模型,那就可以创建用例快速的测试一下。将来我们会采取更多的用例,但现在就简单得替换在第1部分中创建的AddEditScreen来测试一下。

顺便提一下,如果你打开当前的AddEditContact用例,注意我们在Contact实例中删除的部分在用例中被移除了。这是LightSwitch一个很好的功能。当你在设计数据模型时,它能保证你的用例中没有逐句绑定错误。所以当你改变或删除一个实体的属性时(比如我们这个模型中的Phone、Email和Address信息),所有的涉及到整个属性的用例都会被更新。注意如果你在实体中添加了一个属性,LightSwitch不会自动把它添加到你的用例中。不论如何,它使你在最初设计中重命名和删除实体属性时变得很方便。

让我们添加一个新的AddEditContact用例,首先在解决方案管理器中删除在第1部分中建立的这个用例。然后在HTMLClient下的Screens节点上右击,选择Add Screen…

image

在添加新用例窗口中,选择Add/Edit Details Screen模板。在Screen Data下拉菜单中选择Contacts。当你做完这个操作,你会我们创建的相关实体的多选框。选择全部,点击OK。

image

这会建立一个用例,允许你编辑contact详细信息及在不同标签页中查看相关子表。默认情况下,用例以对话框形式显示,但是你可以通过不勾选appearance 部分下的“Show As Dialog”选项,让用例在窗口中全部展开。

image

最后,将这个用例和第1部分中创建的BrowseContacts用例关联起来。在用例设计器中打开BrowseContacts,选择添加Contact按钮并将Tap action设为addAndEditNew。LightSwitch会自动提示跳转到正确的用例。你也可以在属性窗口中改变”添加Contact”按钮的图标。

image

对编辑Contact做同样操作。选择Contacts列表,将Tap action设为editSelected:

image

按F5编译并运行这个应用程序。点击添加按钮(现在图标显示为”+”)来添加新的联系人,或者选择列表中的一个联系人进行编辑。

image

注意LightSwitch会查看所有我们在数据模型中建立的一对多的关系,并为每一个子表创建标签页;Email Addresses、Phone Numbers和Addresses。你可以运用上面我们对Contacts进行的操作使这些列表在那些标签页上也能编辑。选择列表将Tap action设为editSelected,LightSwitch会帮你为每一个字表创建add/edit用例。

因为我们在数据模型中定义了合适的关系,所以LightSwitch在 为添加数据到数据库创建用例时不需要花很多工夫。下一个帖子我们会更深入的了解 用例模板和如何自定义用例的格局。期待下一回合!

希望你喜欢!

阅读下一篇文章: Part 3: Screen Templates, Which One Do I Choose?