天天看點

開始VS 2012 中LightSwitch系列的第2部分:感受關愛——定義資料關系

[原文發表時間]  2012-08-15 18:01

在本篇博文中,我想要關注在第一部分中建立的資料模型之間的資料關系。關系定義了資料庫中一個表中的資訊是如何與另一個表中的資訊相對應的。或更廣義來講,關系定義了在(或跨)資料源中一個實體如何與另一個實體相對應。您可以将實體之間的關系想象為日常生活中的事物之間的關系。例如,學校與學生之間的關系是一個存在于現實世界中的關系。同樣,學生和學生就讀的課程之間存在一個真實的關系。在資料模型中,您可能需要一個實體包含學生,以及另一個實體包含他們就讀的課程。當您将這兩個實體聯系在一起時,就建立了一個關系。

建立一個更好的通訊簿

在我們開始的第 1 部分的示例中,我們建立了一個管理聯系人的位址簿應用程式。在我們目前的資料模型中,我們隻為聯系人存儲一個電話号碼、一個電子郵件位址和一個位址。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7120.image_5F00_074A8E15.png"></a>

然而,在現實生活中,聯系人通常有多個電子郵件、 電話号碼和位址資訊。為了在LightSwitch 中建立的資料庫中示範這一點,我們需要定義其他表,并将它們與聯系人表關聯為一個一對多的關系。一對多關系可能是定義關系中最常見的類型。在我們的例子中,這意味着一個聯系人可以有多個電子郵件位址。一個聯系人可以有很多的電話号碼。一個聯系人也可以有許多的實體位址。

讓我們從電子郵件位址開始。如果我們想要收集聯系人的多個電子郵件位址,我們有幾個選擇。一個選擇是将固定數量的電子郵件屬性以Email1、 Email 2、 Email3 的形式添加到聯系人中。這意味着對于任何給定的聯系人,我們永遠不能收集超過 3 個的電子郵件位址。取決于您所建構的應用程式的類型,這可能已經很好了。但是,如果您以相同的方式(此例中的電子郵件)添加太多的屬性到表中,那麼是時候思考不同的政策了。取而代之的,我們應建立一個EmailAddress表,并定義一個一對多的關系。

在資料設計器中,單擊“New Table”按鈕,将實體定義為EmailAddress,并添加兩個必需的屬性:Email(Email Address類型) 和 EmailType (String類型)。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/0825.image_5F00_156AD5CF.png"></a>

對于EmailType,我們将建立一個Choice List(選擇清單),您在該系列的第 1 部分中已經學到它了。此屬性将捕獲電子郵件的類型,不管是個人還是工作的。我也選擇讓它的最大長度隻有 25 個字元— — 我們永遠不需要所有 的255個字元。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/1374.image_5F00_20B3EA0C.png"></a>

為什麼我們不将最大長度設為 8 個字元呢,它是choice list中的最大長度?因為如果我們以後需要添加值到選擇清單中,如果值超過了 8 個字元,那麼我們不會不得不更改資料模型。如今磁盤空間很便宜,是以最好使用較長的最大長度,那樣所有資料都可以存在基礎表中,這樣就避免了經常更改資料模型。

在 LightSwitch 中定義關系

既然我們已經建好了EmailAddress實體,是時候來定義關系了。單擊資料設計器頂部的"Relationship…"按鈕,這将打開“Add New Relationship”對話框視窗。在"To"列中選擇聯系人來設定一對多關系。預設情況下,多重性被設定為了多對一,是以我們不需要去改變它。多重性定義了您想要在 LightSwitch中建立的關系類型,您還可以将多重性指定為一到零或一,這就是說最多隻能允許一個相關實體。

您還可以指定當删除一個聯系人後,電子郵件位址做何反應。預設情況下,它被設定為"受限"。這意味着如果他們有任何電子郵件位址的話,不允許使用者删除此聯系人。如果我們的客戶下了多個訂單,保留該設定是有意義的。舉個例子,但不是在這個案例中。當我們删除聯系人時,我們想要 LightSwitch 自動删除任何電子郵件位址,是以設定為"删除行為"與"級聯删除"的效果是一樣的。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/4011.image_5F00_7E0FAB90.png"></a>

對話框中的底部說明将幫助您了解在設定關系時所做的事情。一旦單擊OK後,您将在資料設計器中看到關系,它顯示了正在使用的實體之間的所有直接關系。請注意聯系人屬性現在被添加到了EmailAddress實體中。這稱為導航屬性,表示聯系人屬于哪個EmailAddress。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/2055.image_5F00_4E718D04.png"></a>

輕按兩下聯系人實體來将其打開,您會發現,該聯系人有一個導航屬性,可以用來擷取所有的電子郵件位址。導航屬性是由 LightSwitch 在螢幕上使用,以此來浏覽您的資料,是以請務必正确模組化。

既然我們已經定義了EmailAddress表,并設定了關系,現在我們需要删除之前在聯系人表中定義的電子郵件屬性。選擇電子郵件屬性,并按Delete 鍵。或者右擊,然後選擇Delete菜單。同樣,删掉Address1、Address2、 City、 State、 ZIP 和Phone屬性。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/1854.image_5F00_3A0BC779.png"></a>

接下來,讓我們以添加EmailAddress表的相同方式添加一個PhoneNumber表。您可能想知道為什麼我們要建立一個新表來與EmailAddress相區分。這是因為電子郵件和電話号碼是聯系人的不同方面,它們除了通過聯系人之外,彼此并無任何關系。是以,我們需要建立一個新表。

單擊“Add Table”按鈕,并為PhoneNumber實體定義兩個必需的屬性: Phone(Phone Number類型) 和 PhoneType (String 類型)。PhoneType 将會有一個包含“Cell”, “Fax”, “Home”, 和Work”的Choice List。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/8371.image_5F00_36AA2FD1.png"></a>

下一步,以之前完全相同的方式添加關系到聯系人表中。當顯示PhoneNumber實體時,單擊資料設計器頂部的"Relationship…"按鈕,并指定與聯系人表之間的關系。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/0336.image_5F00_41871119.png"></a>

最後但也重要的是,我們需要建立一個Address表來存儲聯系人的多個實體位址。單擊Add Table按鈕,并為Address實體定義以下屬性 :AddressType、Address1、Address2、City、State、ZIP。将 AddressType 和Address1屬性設定為必需的。我們還要為AddressType屬性指定一個包含了“Home”、“Work”、 和“Other”的Choice List。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/6204.image_5F00_5865E295.png"></a>

現在,和之前完全一樣,為Address表設定關系。當Address實體顯示時,則單擊"Relationship…"按鈕并指定其于聯系人表之間的關系。我們再次選擇"級聯删除",那樣如果删除了一個聯系人,則其任何位址将被自動删除。這對于聯系人來說是有意義的,因為如果使用者從系統中删除了該聯系人,其所有的資訊應被自動删除。請牢記,但是,您可能不希望在其他應用程式中使用這種行為。例如,如果建構一個訂單輸入應用程式,如果客戶在系統中有任何訂單,您想要限制删除客戶的行為來保持完好無損的訂單曆史記錄。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/7762.image_5F00_6ED8811C.png"></a>

現在,當我們在資料設計器中打開聯系人的實體時,可以看到所有的直接關系。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/5102.image_5F00_2C1935E4.png"></a>

測試位址簿

既然我們已設計好了資料模型,讓我們通過建立一個螢幕來快速測試它吧。單擊資料設計器頂部的“Screen…”按鈕來打開Add New Screen對話框。在以後的博文中,我們将讨論更多關于螢幕的事情,但現在隻是選擇List and Details界面。然後在Screen Data下拉菜單中選擇聯系人。一旦這樣做了,您将看到我們建立的其他相關聯實體的複選框。全部選擇并單擊OK。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/0871.image_5F00_428BD46B.png"></a>

想要建構和啟動應用程式,就按F5。現在,您可以使用此螢幕輸入資訊。單擊左側清單框頂部的"+"按鈕來添加新的聯系人。

<a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-81-88-metablogapi/2548.image_5F00_784119C5.png"></a>

請注意 LightSwitch 可以讀取我們在資料模型中設定的所有一對多關系,并且聯系人的詳細資訊下面為電子郵件位址、電話号碼和位址建立一個正如我們所期望的網格狀的表格區域。在預設情況下網格是可以編輯的,是以您可以将相關的資料直接輸入道行中。

因為我們在資料模型中合理地定義了關系,是以LightSwitch能夠建立一個非常實用的螢幕來讓我們毫不費力地将資料輸入到資料庫中的所有表中。在下一篇博文中,我們将會深入探讨螢幕模闆以及如何自定義螢幕布局。下一次再見 !

希望大家喜歡!