次の方法で共有


コードを使用したデータ関連タスクの実行

Visual Studio 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 メソッドを呼び出して、それらの変更をコミットする必要があります。

データの削除

エンティティの 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;


}

データの検証

エンティティのフィールドにカスタム検証規則を適用できます。 検証規則に準拠していない方法でユーザーがプロパティの値を変更したときに表示されるカスタム エラー メッセージを追加することができます。 詳細については、「方法: LightSwitch アプリケーションでデータを検証する」を参照してください。

データのアクセス許可を設定

既定では、すべてのユーザーは画面に表示されるデータを表示、挿入、削除、または更新できます。 ただし、次の方法のいずれかのメソッドにコードを追加して、これらのアクセス許可を制限できます。

  • CanRead

  • CanInsert

  • CanDelete

  • CanUpdate

これらのメソッドを使用して操作を制限すると、LightSwitch は、無制限のアクセス許可を持っていないユーザーが操作をできないようにします。 詳細については、「方法: データ イベントを処理する」を参照してください。

次の例では、ユーザーに更新権限がある場合にユーザーが顧客情報を更新できるようにします。 このコード例では、RoleUpdate という名前のアクセス許可グループが必要です。 アプリケーションにアクセス許可グループを追加する方法の詳細については、「LightSwitch における承認の有効化とアクセス許可の作成」を参照してください。

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 メソッドにコードを追加してクエリを拡張できます。 詳細については、「方法: コードを使用してクエリを拡張する」を参照してください。