保存存在一对一关系的数据

[原文发表地址]Saving Data Across One-to-One Relationships

[原文发表时间] 2013-05-09 01:59 AM

关于如何在Visual Studio LightSwitch数据表中添加有着一对零或者一对一关系的数据,我最近产生了两个疑惑。相关记录是否是强制性的(必须有的)决定了你插入数据时拥有的两种不同的选择。在这篇博文里,我将向大家展示在桌面和手机客户端做这类数据保存操作的两种不同的选择。

数据模型

我们以一个简单的客户数据模型和相关表格CustomerNote为例。一个客户端可以在relationship中定义0到1条note。

image

在我们创建自己的客户屏幕时,LightSwitch会自动引入CustomerNote字段。对于编辑屏幕这正是我们需要的,因为这样就可以允许用户在一个屏幕上编辑所有表格的字段了。然而,在AddNew 屏幕上,LightSwitch 不会自动添加一条记录到CustomerNote表中——我们需要根据note是否是强制性地来为此操作写代码。

image

向SilverLight 客户端添加代码

为了使Silverlight桌面客户端支持这个功能,我们需要添加一些VB(或者C#)的代码。

强制的 :总是需要添加一条相关记录

如果你需要总是添加一条相关记录的话,那就采用_Created事件。打开根记录(例子里:Customer)的数据设计器,选择DesktopClient perspective,然后在_Created事件中写代码来实现一旦插入根记录便自动添加一条相关记录。

image

添加如下粗体的代码。

VB:

 Public Class Customer
     Private Sub Customer_Created()
         Me.CustomerNote = New CustomerNote()
     End Sub
 End Class

C#:

 public partial class Customer
 {
     partial void Customer_Created()
     {
         this.CustomerNote = new CustomerNote();
     }
 }

现在当我们运行桌面客户端并且添加一个新客户时,note字段是启用的。

image

可选的 :允许用户自己决定

如果相关记录是可选记录,并且你想加入用户选择功能,可以通过在你的屏幕上添加一个动作(如一个按钮)来实现。打开屏幕设计器添加一个按钮,选择“Write my own method”并且在AddNote中调用它,然后编辑CanExecute和Execute 方法。

image

VB:

 Private Sub AddNote_CanExecute(ByRef result As Boolean)
     'Only enable the button if there is no note
     result = (Me.CustomerProperty.CustomerNote Is Nothing)
 End Sub
  
 Private Sub AddNote_Execute()
     ' Add the note
     Me.CustomerProperty.CustomerNote = New CustomerNote()
 End Sub

C#:

 partial void AddNote_CanExecute(ref bool result)
 {
     // Only enable the button if there is no note
     result = (this.CustomerProperty.CustomerNote == null);
 }
  
 partial void AddNote_Execute()
 {
     // Add the note
     this.CustomerProperty.CustomerNote = new CustomerNote();
 }

向HTML客户端添加代码

为了在html客户端支持这个功能,我们需要写一些JavaScript代码。

强制的:总是添加一条相关记录

打开根记录的数据设计器,但这次选择HTMLClient perspective 然后在 _Created事件中添加JavaScript代码来实现每次插入根记录时自动添加一条相关记录。

 myapp.Customer.created = function (entity) {
  
 entity.CustomerNote = new myapp.CustomerNote();
  
 };

注意这里myapp对象的使用。你可以以各种方式使用myapp对象来访问HTML客户端的数据和屏幕。请在此处查看其它用法——如何使用代码编辑HTML界面

现在当我们运行HTML客户端并且添加一个新客户时,note域是启用的。

image

可选的 :允许用户自己决定

打开屏幕设计器添加一个按钮,选择“Write my own method”并且在AddNote中调用它,然后编辑CanExecute和Execute 方法。加入如下代码:

 myapp.AddEditCustomer.AddNote_canExecute = function (screen) {
  
 // enables the button (returns true) if the note doesn't exist
  
  return (screen.Customer.CustomerNote == null);
  
 };
  
 myapp.AddEditCustomer.AddNote_execute = function (screen) {
  
 //Add a new note

总结

如上所述就是两种管理拥有一对零或者一对一关系的数据的方法。请记住虽然这些数据表都属于同一个数据源,但这也不是必须的,采用这种方式,你也可以建立虚拟关系。如果你的确拥有彼此独立的数据源,你还需要告知LightSwitch你想采用哪种顺序更新它们。如想获知更多信息,请参考: 为保存多种数据源定制保存命令

玩得愉快!