开始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 部分的示例中,我们建立了一个管理联系人的地址簿应用程序。在我们当前的数据模型中,我们只为联系人存储一个电话号码、一个电子邮件地址和一个地址。
![]()
然而,在现实生活中,联系人通常有多个电子邮件、 电话号码和地址信息。为了在LightSwitch 中建立的数据库中示范这一点,我们需要定义其他表,并将它们与联系人表关联为一个一对多的关系。一对多关系可能是定义关系中最常见的类型。在我们的例子中,这意味着一个联系人可以有多个电子邮件地址。一个联系人可以有很多的电话号码。一个联系人也可以有许多的物理地址。
让我们从电子邮件地址开始。如果我们想要收集联系人的多个电子邮件地址,我们有几个选择。一个选择是将固定数量的电子邮件属性以Email1、 Email 2、 Email3 的形式添加到联系人中。这意味着对于任何给定的联系人,我们永远不能收集超过 3 个的电子邮件地址。取决于您所构建的应用程序的类型,这可能已经很好了。但是,如果您以相同的方式(此例中的电子邮件)添加太多的属性到表中,那么是时候思考不同的策略了。取而代之的,我们应创建一个EmailAddress表,并定义一个一对多的关系。
在数据设计器中,单击“New Table”按钮,将实体定义为EmailAddress,并添加两个必需的属性:Email(Email Address类型) 和 EmailType (String类型)。
![]()
对于EmailType,我们将创建一个Choice List(选择列表),您在该系列的第 1 部分中已经学到它了。此属性将捕获电子邮件的类型,不管是个人还是工作的。我也选择让它的最大长度只有 25 个字符— — 我们永远不需要所有 的255个字符。
![]()
为什么我们不将最大长度设为 8 个字符呢,它是choice list中的最大长度?因为如果我们以后需要添加值到选择列表中,如果值超过了 8 个字符,那么我们不会不得不更改数据模型。如今磁盘空间很便宜,所以最好使用较长的最大长度,那样所有数据都可以存在基础表中,这样就避免了经常更改数据模型。
在 LightSwitch 中定义关系
既然我们已经建好了EmailAddress实体,是时候来定义关系了。单击数据设计器顶部的"Relationship…"按钮,这将打开“Add New Relationship”对话框窗口。在"To"列中选择联系人来设置一对多关系。默认情况下,多重性被设置为了多对一,所以我们不需要去改变它。多重性定义了您想要在 LightSwitch中创建的关系类型,您还可以将多重性指定为一到零或一,这就是说最多只能允许一个相关实体。
有关定义不同类型的关系的详细信息,请参阅:如何: 定义数据关系
有关如何在 LightSwitch中 构建多对多关系的信息,请参阅:如何创建多对多关系
您还可以指定当删除一个联系人后,电子邮件地址做何反应。默认情况下,它被设置为"受限"。这意味着如果他们有任何电子邮件地址的话,不允许用户删除此联系人。如果我们的客户下了多个订单,保留该设置是有意义的。举个例子,但不是在这个案例中。当我们删除联系人时,我们想要 LightSwitch 自动删除任何电子邮件地址,所以设置为"删除行为"与"级联删除"的效果是一样的。
![]()
对话框中的底部说明将帮助您了解在设置关系时所做的事情。一旦单击OK后,您将在数据设计器中看到关系,它显示了正在使用的实体之间的所有直接关系。请注意联系人属性现在被添加到了EmailAddress实体中。这称为导航属性,表示联系人属于哪个EmailAddress。
![]()
双击联系人实体来将其打开,您会发现,该联系人有一个导航属性,可以用来获取所有的电子邮件地址。导航属性是由 LightSwitch 在屏幕上使用,以此来浏览您的数据,所以请务必正确建模。
既然我们已经定义了EmailAddress表,并设置了关系,现在我们需要删除之前在联系人表中定义的电子邮件属性。选择电子邮件属性,并按Delete 键。或者右击,然后选择Delete菜单。同样,删掉Address1、Address2、 City、 State、 ZIP 和Phone属性。
![]()
接下来,让我们以添加EmailAddress表的相同方式添加一个PhoneNumber表。您可能想知道为什么我们要创建一个新表来与EmailAddress相区分。这是因为电子邮件和电话号码是联系人的不同方面,它们除了通过联系人之外,彼此并无任何关系。因此,我们需要创建一个新表。
单击“Add Table”按钮,并为PhoneNumber实体定义两个必需的属性: Phone(Phone Number类型) 和 PhoneType (String 类型)。PhoneType 将会有一个包含“Cell”, “Fax”, “Home”, 和Work”的Choice List。
![]()
下一步,以之前完全相同的方式添加关系到联系人表中。当显示PhoneNumber实体时,单击数据设计器顶部的"Relationship…"按钮,并指定与联系人表之间的关系。
![]()
最后但也重要的是,我们需要创建一个Address表来存储联系人的多个物理地址。单击Add Table按钮,并为Address实体定义以下属性 :AddressType、Address1、Address2、City、State、ZIP。将 AddressType 和Address1属性设置为必需的。我们还要为AddressType属性指定一个包含了“Home”、“Work”、 和“Other”的Choice List。
![]()
现在,和之前完全一样,为Address表设置关系。当Address实体显示时,则单击"Relationship…"按钮并指定其于联系人表之间的关系。我们再次选择"级联删除",那样如果删除了一个联系人,则其任何地址将被自动删除。这对于联系人来说是有意义的,因为如果用户从系统中删除了该联系人,其所有的信息应被自动删除。请牢记,但是,您可能不希望在其他应用程序中使用这种行为。例如,如果构建一个订单输入应用程序,如果客户在系统中有任何订单,您想要限制删除客户的行为来保持完好无损的订单历史记录。
![]()
现在,当我们在数据设计器中打开联系人的实体时,可以看到所有的直接关系。
![]()
测试地址簿
既然我们已设计好了数据模型,让我们通过创建一个屏幕来快速测试它吧。单击数据设计器顶部的“Screen…”按钮来打开Add New Screen对话框。在以后的博文中,我们将讨论更多关于屏幕的事情,但现在只是选择List and Details界面。然后在Screen Data下拉菜单中选择联系人。一旦这样做了,您将看到我们创建的其他相关联实体的复选框。全部选择并单击OK。
![]()
想要构建和启动应用程序,就按F5。现在,您可以使用此屏幕输入信息。单击左侧列表框顶部的"+"按钮来添加新的联系人。
![]()
请注意 LightSwitch 可以读取我们在数据模型中设置的所有一对多关系,并且联系人的详细信息下面为电子邮件地址、电话号码和地址创建一个正如我们所期望的网格状的表格区域。在默认情况下网格是可以编辑的,因此您可以将相关的数据直接输入道行中。
因为我们在数据模型中合理地定义了关系,所以LightSwitch能够创建一个非常实用的屏幕来让我们毫不费力地将数据输入到数据库中的所有表中。在下一篇博文中,我们将会深入探讨屏幕模板以及如何自定义屏幕布局。下一次再见 !
希望大家喜欢!
开始VS 2012 中LightSwitch系列的第2部分:感受关爱——定义数据关系的更多相关文章
- 开始VS 2012中LightSwitch系列的第3部分:我该选择哪一个屏幕模板
[原文发表地址] Beginning LightSwitch in VS 2012 Part 3: Screen Templates, Which One Do I Choose? [原文发表时间] ...
- 开始VS 2012中LightSwitch系列的第4部分:太多信息了!使用查询来排序和筛选数据
[原文发表地址] Beginning LightSwitch in VS 2012 Part 4: Too much information! Sorting and Filtering Data ...
- 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?
[原文发表地址] Beginning LightSwitch in VS 2012 Part 5: May I? Controlling Access with User Permissions [ ...
- 开始VS 2012 中LightSwitch系列的第1部分:表中有什么?描述你的数据
[原文发表地址] Beginning LightSwitch in VS 2012 Part 1: What’s in a Table? Describing Your Data [原文发表时间] ...
- 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project
SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...
- VS2010(2012)中使用Unit Testing进行单元测试
原文 VS2010(2012)中使用Unit Testing进行单元测试 使用VS 2012自带的Unit Testing工具进行单元测试是非常方便的.网上关于这方面的例子很多,这篇随笔只起个人学习笔 ...
- SQL Server 2012中快速插入批量数据的示例及疑惑
SQL Server 2008中SQL应用系列--目录索引 今天在做一个案例演示时,在SQL Server 2012中使用Insert语句插入1万条数据,结果遇到了一个奇怪的现象,现将过程分享出来,以 ...
- 如何在Visual Studio 2012中发布Web应用程序时自动混淆Javascript
同Java..NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护.尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说, ...
- 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7 标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...
随机推荐
- MVC4.0 扩展辅助方法
新年第一天上班,写个博客开头吧! 在MVC中,辅助类是很常见的,比如说,Html.TextBox().Html.DropDownListFor()等,这些都是微软帮我们封装好的,可以直接调用的,它们解 ...
- PHP的文件格式应该以UTF-8无BOM编码
前一段时间写PHP,经常在解析文件之前就要对数据进行处理判断,并以header()的方式进行页面跳转.然而后来将文件放到 linux 服务器时常碰到header()解析出错的情况,而在 windows ...
- jQuery插件编写笔记
插件的种类: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. *所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上. *在插件 ...
- Ceph剖析:定时器safetimer的实现
定时器的作用是在指定的时间执行指定的动作.SafeTimer通过multimap数据结构维护定时项,定时项是时间和事件的Pair,定时项在map中按照定时时间从小到大排列.此外,SafeTimer使用 ...
- Chocolatey
知乎上有人提到如何节省时间, 1.自动化 2.批量化 Chocolatey (https://chocolatey.org/)是一个自动化程序安装工具.今天试用了一下 ,想想每年因为安装软件而损失的时 ...
- Windows下解压版mysql的安装方法
1 首先下载mysql的解压版的rar安装包 1 将安装包解压到安装路径.C:\Program Files (x86)\MySQL2 将安装路径下的bin追加到环境变量"PATH" ...
- Spring+struts2的基础上继续加hibernate3的jar包
- UITextField使用详解
转iOS中UITextField使用详解 (1) //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFr ...
- XML增、删、改
今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 一.简单介绍 using System.Xml; ...
- load与initialize
NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...