コードを使用したデータ関連タスクの実行
Visual Studio LightSwitch のデザイナーやツール ウィンドウを使用して、多くのデータ関連のデザイン タスクを実行できます。ただし、特定のタスクはアプリケーションにコードを追加する方法でのみ達成できます。たとえば、カスタム条件を適用することによってフィールドを検証するには、コードを記述する必要があります。このドキュメントでは、データ ランタイム オブジェクト モデルを使用して、データ関連のタスクを実行する方法を示しています。アプリケーションでコードを記述できる場所の詳細については、次のトピックを参照してください。
Visual Studio LightSwitch でのコード記述方法の一般的なガイダンスについては、「LightSwitch でのコードの記述」を参照してください。
一般的なタスク
データ ランタイム オブジェクト モデルを使用して実行できるいくつかの一般的なデータ関連タスクを次に示します。タスクについてはドキュメントの後の部分で説明されています。
データの読み取り
データの更新
データの削除
データの追加
データの保存
データの検証
データのアクセス許可を設定
変更セットの操作
クエリの拡張
データの読み取り
アプリケーションのどのデータ ソースからも個々のデータ項目またはデータ項目のコレクションを読むことができます。
次の例では、画面で現在選択されている顧客を取得します。
Private Sub RetrieveCustomer_Execute()
Dim cust As Customer = Me.Customers.SelectedItem
If cust.ContactName = "Bob" Then
'Perform some task on the customer entity.
End If
End Sub
partial void RetrieveCustomer_Execute()
{
Customer cust = this.Customers.SelectedItem;
if (cust.ContactName == "Bob")
{
//Perform some task on the customer entity.
}
}
次の例は顧客のコレクションを反復処理します。
Private Sub RetrieveCustomers_Execute()
For Each cust As Customer In Me.DataWorkspace.NorthwindData.Customers
If cust.ContactName = "Bob" Then
'Perform some task on the customer entity.
End If
Next
End Sub
partial void RetrieveCustomers_Execute()
{
foreach (Customer cust in this.DataWorkspace.NorthwindData.Customers)
{
if (cust.ContactName == "Bob")
{
//Perform some task on the customer entity.
}
}
}
データ リレーションシップのナビゲーション
関連エンティティからデータを読み取ることができます。たとえば、顧客エンティティは注文エンティティと一対多リレーションシップがあります。顧客エンティティの [注文] プロパティを使用して、顧客が行ったすべての注文を反復処理できます。
次の例は、顧客に関連する注文のコレクションを反復処理します。
Private Sub RetrieveSalesOrders_Execute()
Dim cust As Customer = Me.Customers.SelectedItem
For Each myOrder As Order In cust.Orders
If myOrder.OrderDate = Today Then
'Perform some task on the order entity.
End If
Next
End Sub
partial void RetrieveSalesOrders_Execute()
{
Customer cust = this.Customers.SelectedItem;
foreach (Order order in cust.Orders)
{
if (order.OrderDate == DateTime.Today)
{
//perform some task on the order entity.
}
}
}
次の例では、特定の注文を行った顧客を取得します。
Private Sub RetrieveCustomer_Execute()
Dim order As Order
order = Me.DataWorkspace.NorthwindData.Orders_Single _
(Orders.SelectedItem.OrderID)
Dim cust As Customer
cust = order.Customer
'Perform some task on the order entity.
End Sub
partial void RetrieveCustomer_Execute()
{
Order order = this.DataWorkspace.NorthwindData.Orders_Single
(Orders.SelectedItem.OrderID);
Customer cust = order.Customer;
//Perform some task on the customer entity.
}
クエリを実行してデータを読み取る
モデルからクエリを取得し、それらをコードで実行できます。例については、「方法: コードを使用してクエリからデータを取得する」を参照してください。
データの更新
コードを使用して任意のエンティティのデータを更新できます。次の例は、ユーザーが画面の [注文] エンティティで注文を作成し、[保存] をクリックすると実行されるコードを示しています。コードは、[注文の詳細] エンティティのフィールドを使用して、[製品] エンティティのフィールドを更新します。
Private Sub Orders_Inserting(entity As Order)
For Each detail In entity.Order_Details
detail.Product.UnitsInStock =
detail.Product.UnitsInStock - detail.Quantity
Next
End Sub
partial void Orders_Inserting(Order entity)
{
foreach (Order_Detail detail in entity.Order_Details)
{
detail.Product.UnitsInStock =
(short?)(detail.Product.UnitsInStock - detail.Quantity);
}
}
[!メモ]
コードが他のデータ ソースのデータを変更する場合、そのデータ ソースの SaveChanges メソッドを呼び出して、それらの変更をコミットする必要があります。詳細については、「How to: Save Data」を参照してください。
データの削除
エンティティの Delete メソッドを呼び出して、データを削除できます。次の例は、顧客を NorthwindData データ ソースから削除します。
Private Sub DeleteCustomer_Execute()
Dim cust As Customer
cust = Me.Customers.SelectedItem
If Customers.CanDelete Then
cust.Delete()
End If
End Sub
partial void DeleteCustomer_Execute()
{
Customer cust =
this.Customers.SelectedItem;
if (Customers.CanDelete)
{
cust.Delete();
}
}
データの追加
次の例は、新しい顧客を NorthwindData データ ソースに追加します。この例は、SharePoint リストに新しく追加された連絡先の情報を使用して、新しい顧客を説明フィールドを設定します。例は、SharePoint リスト内のどの連絡先が NorthwindData データ ソースにまだインポートされていないかを確認するために、NewCustomersInSharePoint という名前のクエリを呼び出します。
Private Sub ImportCustomers_Execute()
For Each spCust As SharePointCustomer In _
Me.DataWorkspace.SharePointData.NewCustomersInSharePoint
Dim newCust As Customer = New Customer()
With newCust
.ContactName = spCust.FirstName & " " & spCust.LastName
.Address = spCust.Address
.City = spCust.City
.PostalCode = spCust.PostalCode
.Region = spCust.Region
'Set the CopiedToDatabase field of the item in SharePoint.
spCust.CopiedToDatabase = "Yes"
End With
Next
Me.DataWorkspace.SharePointData.SaveChanges()
End Sub
partial void ImportCustomers_Execute()
{
foreach (SharePointCustomer spCust in
this.DataWorkspace.SharePointData.NewCustomersInSharePoint())
{
Customer newCust = new Customer();
newCust.ContactName = spCust.FirstName + " " + spCust.LastName;
newCust.Address = spCust.Address;
newCust.City = spCust.City;
newCust.PostalCode = spCust.PostalCode;
newCust.Region = spCust.Region;
//Set the CopiedToDatabase field of the item in SharePoint.
spCust.CopiedToDatabase = "Yes";
}
this.DataWorkspace.SharePointData.SaveChanges();
}
データの保存
通常、ユーザーが画面で [保存] ボタンをクリックすると、保留中の変更はデータ ソースにコミットされます。しかし、データ ソースの SaveChanges メソッドを呼び出すコードを追加することにより、保留中の変更をコミットできます。これらのタスクのいずれかを実行するには、このコードを追加する必要があります。
他のデータ ソースにあるデータに加えた変更をコミットします。
画面の Save イベントをオーバーライドします。
他のデータ ソースにあるデータに加えた変更をコミットする
カスタム コードを記述するファイルにはプライマリ データ ソースがあります。LightSwitch ソリューション内に別のデータ ソースのデータを変更するカスタム コードを追加する場合、そのデータ ソースの SaveChanges メソッドを呼び出して、それらの変更をコミットする必要があります。
次の例は、ユーザーが画面の [注文] エンティティで注文を作成し、[保存] をクリックすると実行されるコードを示しています。コードは、[注文の詳細] エンティティのフィールドを使用して、[製品] エンティティのフィールドを更新します。[製品] エンティティは別のデータ ソースに存在するため、このコードは変更をコミットするためにそのデータ ソースの SaveChanges メソッドを呼び出します。
Private Sub Orders_Inserting(entity As Order1)
For Each detail In entity.Order_Details
detail.Product.UnitsInStock = detail.Product.UnitsInStock - detail.Quantity
Next
Me.DataWorkspace.ProductDataSource.SaveChanges()
End Sub
partial void Orders_Inserting(Order1 entity)
{
foreach (Order_Detail1 detail in entity.Order_Details)
{
detail.Product.UnitsInStock = (short?)
(detail.Product.UnitsInStock - detail.Quantity);
}
this.DataWorkspace.ProductDataSource.SaveChanges();
}
画面のイベントの保存をオーバーライドします。
画面の [保存] ボタンの動作を変更するには、Save イベントをオーバーライドします。[保存] ボタンの動作を交換することになるため、保留中の変更をコミットする場合はコードで SaveChanges メソッドを呼び出す必要があります。
次の例は、保存操作が失敗した場合にスローされる可能性のある特定の例外をキャッチしてスローするために、顧客画面の Save イベントをオーバーライドします。
Private Sub CustomersListDetail_Saving(ByRef handled As Boolean)
Try
Me.DataWorkspace.SharePointData.SaveChanges()
Catch ex As DataServiceOperationException
If ex.ErrorInfo = "DTSException" Then
Me.ShowMessageBox(ex.Message)
Else
Throw ex
End If
End Try
handled = True
End Sub
partial void CustomersListDetail_Saving(ref bool handled)
{
try
{
this.DataWorkspace.SharePointData.SaveChanges();
}
catch (DataServiceOperationException ex)
{
if (ex.ErrorInfo == "DTSException")
{
this.ShowMessageBox(ex.Message);
}
else
{
throw ex;
}
}
handled = true;
}
データの検証
エンティティのフィールドにカスタム検証規則を適用できます。検証規則に準拠していない方法でユーザーがプロパティの値を変更したときに表示されるカスタム エラー メッセージを追加することができます。詳細については、「方法: データを検証する」を参照してください。
データのアクセス許可を設定
既定では、すべてのユーザーは画面に表示されるデータを表示、挿入、削除、または更新できます。ただし、次の方法のいずれかのメソッドにコードを追加して、これらのアクセス許可を制限できます。
CanRead
CanInsert
CanDelete
CanUpdate
これらのメソッドを使用して操作を制限すると、LightSwitch は、無制限のアクセス許可を持っていないユーザーが操作をできないようにします。詳細については、「方法: データ イベントを処理する」を参照してください。
次の例では、ユーザーに更新権限がある場合にユーザーが顧客情報を更新できるようにします。このコード例では、RoleUpdate という名前のアクセス許可グループが必要です。アプリケーションにアクセス許可グループを追加する方法の詳細については、「承認の有効化とアクセス許可の作成」を参照してください。
Private Sub Customers_CanUpdate(ByRef result As Boolean)
result = Me.Application.User.HasPermission(Permissions.RoleUpdate)
End Sub
partial void Customers_CanUpdate(ref bool result)
{
result = this.Application.User.HasPermission(Permissions.RoleUpdate);
}
既定では、ユーザーが情報を表示、挿入、削除、または更新しようとすると、LightSwitch はこれらのメソッドを呼び出します。データの読み取りまたは変更の前に、カスタム コードでこれらのメソッドを呼び出すこともできます。
変更セットの操作
データ ソースにコミットされる前に、保留中の変更を識別し、破棄できます。次の例は、保留中の変更を特定して破棄する 3 つのユーザー メソッドを示しています。UndoAllCustomerUpdates メソッドは、すべての顧客に対するすべての変更を破棄します。UndoAllUpdates メソッドは、データ ソースに対するすべての変更を破棄します。UndoCustomerEdit メソッドは、顧客画面で現在選択されているデータ行への変更を破棄します。
Private Sub UndoAllCustomerUpdates_Execute()
For Each Cust As Customer In _
Me.DataWorkspace.NorthwindData.Details. _
GetChanges().OfType(Of Customer)()
Cust.Details.DiscardChanges()
Next
End Sub
Private Sub UndoAllUpdates_Execute()
Me.DataWorkspace.NorthwindData.Details.DiscardChanges()
End Sub
Private Sub UnduCustomerEdit_Execute()
Customers.SelectedItem.Details.DiscardChanges()
End Sub
partial void UndoAllCustomerUpdates_Execute()
{
foreach (Customer cust in
this.DataWorkspace.NorthwindData.Details.
GetChanges().OfType<Customer>())
{
cust.Details.DiscardChanges();
}
}
partial void UndoAllUpdates_Execute()
{
this.DataWorkspace.NorthwindData.Details.DiscardChanges();
}
partial void UndoCustomerEdit_Execute()
{
Customers.SelectedItem.Details.DiscardChanges();
}
モデル化されたクエリの拡張
クエリ デザイナーの機能を上回る方法でクエリを変更する場合は、クエリの PreProcessQuery メソッドにコードを追加してクエリを拡張できます。詳細については、「方法: コードを使用してクエリを拡張する」を参照してください。