共用方式為


使用程式碼執行與資料相關的工作

您可以使用 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.
        }
    }
}

Ff851990.collapse_all(zh-tw,VS.110).gif瀏覽資料關聯性

您可以從相關的實體讀取資料。 例如,[客戶] 實體可能與 [訂單] 實體之間具有一對多關聯性。 您可以使用 [客戶] 實體的 [訂單] 屬性,逐一查看客戶已提交的所有訂單。

下列範例會逐一查看與客戶相關的訂單集合。

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.

}

Ff851990.collapse_all(zh-tw,VS.110).gif執行查詢以讀取資料

您可以從模型中擷取查詢,然後在程式碼中加以執行。 若要檢視範例,請參閱HOW TO:使用程式碼從查詢擷取資料

更新資料

您可以使用程式碼更新任何實體的資料。 下列範例示範一個程式碼,這個程式碼會在使用者於畫面的 [訂單] 實體中建立訂單,並按一下 [儲存] 按鈕時執行。 程式碼會使用 [訂單詳細資料] 實體中的欄位來更新 [產品] 實體中的欄位。

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 清單之連絡人的資訊,以填入描述新客戶的欄位。 範例會呼叫名為 NewCustomersInSharePoint 的查詢,以確定 SharePoint 清單中尚未匯入至 NorthwindData 資料來源的連絡人。

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 事件。

Ff851990.collapse_all(zh-tw,VS.110).gif認可對位在其他資料來源中的資料所做的變更

您撰寫自訂程式碼的檔案具有主要資料來源。 如果您加入修改 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();

}

Ff851990.collapse_all(zh-tw,VS.110).gif覆寫畫面的儲存事件

您可以藉由覆寫 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;


}

驗證資料

您可以將自訂驗證規則套用至實體的欄位。 您可以加入會在使用者修改屬性值的方式不符合驗證規則時顯示的自訂錯誤訊息。 如需詳細資訊,請參閱HOW TO:驗證資料

設定資料的使用權限

預設情況下,所有使用者都可以檢視、插入、刪除或更新顯示在畫面中的資料。 但是您可以將程式碼加入至下列其中一個方法,限制這些使用權限:

  • CanRead

  • CanInsert

  • CanDelete

  • CanUpdate

如果您使用這些方法限制某項作業,LightSwitch 就會讓沒有不受限制使用權限的使用者無法進行該作業。 如需詳細資訊,請參閱HOW TO:處理資料事件

如果使用者具有更新使用權限,下列範例就會允許使用者更新客戶資訊。 此程式碼範例需要名為 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 預設會呼叫這些方法。 讀取或修改資料之前,您也可以在自訂程式碼中呼叫這些方法。

使用變更集

在將暫止的變更認可至資料來源之前,您可以識別並捨棄它們。 下列範例示範三個用來識別並捨棄暫止變更的使用者方法。 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 方法來擴充查詢。 如需詳細資訊,請參閱HOW TO:使用程式碼擴充查詢的功能

請參閱

概念

在 LightSwitch 中撰寫程式碼