Поделиться через


Выполнения задач, связанных с данными, с помощью кода

В 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. В этом примере вызывается запрос с именем 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 экрана.

Фиксация изменений в данных, расположенных в других источниках данных

Файлы, в которых пишется настраиваемый код, используют первичный источник данных. При добавлении настраиваемого кода, который изменяет данные из другого источника в решении 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 эти методы вызываются, когда пользователь пытается просмотреть, вставить, удалить или обновить информацию. Эти методы также можно вызвать в пользовательском коде до считывания или изменения данных.

Работа с наборами изменений

Можно определить и отклонить ожидающие изменения, прежде чем они будут зафиксированы в источнике данных. В следующем примере показаны три пользовательских метода, которые определяют и отклоняют ожидающие изменения. Метод 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. Для получения дополнительной информации см. Практическое руководство. Расширение запроса с помощью кода.