Silverlight PresentationModel содержит коллекцию другой презентацииModel - PullRequest
1 голос
/ 11 марта 2012

У меня есть чтение бизнес-приложения Pro с Silverlight 4, написанное Крисом Андерсоном. Что касается темы ЭКСПОЗИЦИЯ ДАННЫХ С СЕРВЕРА: ИСПОЛЬЗОВАНИЕ УСЛУГ RIA WCF - Типы моделей презентации, это не так, что подробности об объекте модели презентации содержат свойство, представляющее коллекциюдругого объекта модели представления.

У меня есть основная идея о том, как создать presentationModel, но как насчет PresentationModel содержит коллекцию другого PresentationModel?Пример ProductPM содержит коллекцию ProductInventoryPM?Как написать код CRUD в классе обслуживания домена?

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 марта 2012

В вашем коде нужно сделать несколько вещей.Во-первых, чтобы иметь возможность просматривать список записей инвентаризации продуктов, вам необходимо выбрать их как часть вашей операции домена GetProducts:

Public Function GetProducts() As IQueryable(Of ProductPM)
    Return From p As Product In Me.ObjectContext.Products.Include("ProductInventories") Select New ProductPM With
                                                                 {.ListPrice = p.ListPrice,
                                                                  .ModifiedDate = p.ModifiedDate,
                                                                  .Name = p.Name,
                                                                  .ProductID = p.ProductID,
                                                                  .ProductNumber = p.ProductNumber,
                                                                  .ProductInventory = From i In p.ProductInventories Select New ProductInventoryPM With
                                                                     {
                                                                        .Quantity = i.Quantity,
                                                                        .ProductID = p.ProductID
                                                                     }
                                                                 }
End Function

, которая отобразит их во второй сетке данных.

Вам также необходимо добавить конструктор к вашему классу ProductPM, который инициализирует класс ProductInventory:

Public Sub New()
    ProductInventory = New List(Of ProductInventoryPM)
End Sub

Последняя проблема заключается в том, что операции домена вставки вызываются в неправильном порядке.Насколько я могу судить, лучший способ справиться с этим заключается в следующем:

  1. Создание пустой операции вставки домена для объекта ProductInventoryPM.В нем не требуется никакой логики, но метод необходим для того, чтобы объект ProductInventoryPM можно было добавить в коллекцию инвентаризации ProductPM.

    Public Sub InsertProductInventory(ByVal ProductInventoryPM As ProductInventoryPM)
    
    End Sub
    

    ПРИМЕЧАНИЕ. Если вы хотите иметь возможность добавлять новыезаписи инвентаризации после того, как вы создали продукт + начальная запись инвентаризации, затем вам нужно будет добавить логику к этой операции домена.,Преимущество этого состоит в том, что нет необходимости вызывать SaveChanges.

    Public Sub InsertProduct(ByVal ProductPM As ProductPM)
        Dim Product As New Product
        Product.Name = ProductPM.Name
        Product.ProductNumber = ProductPM.ProductNumber
        Product.ListPrice = ProductPM.ListPrice
        Product.SellStartDate = DateTime.Now
        Product.ModifiedDate = DateTime.Now
        Product.SafetyStockLevel = 1000
        Product.ReorderPoint = 700
        Product.StandardCost = 0
        Product.DaysToManufacture = 3
        Product.rowguid = Guid.NewGuid()
    
        Me.ObjectContext.Products.AddObject(Product)
        Me.ChangeSet.Associate(ProductPM, Product, AddressOf UpdateProductPMKey)
    
        For Each ProductInventoryPM As ProductInventoryPM In ProductPM.ProductInventory
            Dim productInventory As New ProductInventory
    
            With productInventory
                .Bin = 1
                .LocationID = 1
                .ModifiedDate = DateTime.Now
                .ProductID = ProductInventoryPM.ProductID
                .Quantity = ProductInventoryPM.Quantity
                .Shelf = "A"
            End With
    
            Product.ProductInventories.Add(productInventory)
            Me.ChangeSet.Associate(ProductInventoryPM, productInventory, AddressOf UpdateProductInventoryKey)
        Next
    End Sub
    

Теперь, если вы запустите его, все должно работать нормально.Дайте мне знать, как это происходит.

Крис

0 голосов
/ 13 марта 2012

Спасибо большое, все работает нормально.

И я изменил операцию «Вставка домена» для объекта ProductInventoryPM, как показано ниже, чтобы новую запись ProductInventory можно было добавить в существующий продукт.

Публичный вложенный продукт ProductInventory (ByVal ProductInventoryPM As ProductInventoryPM)

Если ProductInventoryPM.ProductID <> 0, то

Тусклый товарный инвентарь как новый товарный инвентарь
С продуктом инвентаризации .Bin = 1
.LocationID = 1
.ModifiedDate = DateTime.Now
.ProductID = ProductInventoryPM.ProductID
.Quantity = ProductInventoryPM.Quantity
.Shelf = "A"
Конец

Product.ProductInventories.Add (productInventory)
Me.ChangeSet.Associate (ProductInventoryPM, productInventory, AddressOf UpdateProductInventoryKey)

End If

End Sub

0 голосов
/ 12 марта 2012

Методы CRUD для связанных типов точно такие же, как и для основных типов.В SL4-версии книги в нижней части раздела под названием «Обновление типов моделей презентаций» есть примечание, в котором обсуждается это.По сути, вы просто пишете методы Get, Update, Insert и Delete для своих моделей ProductInventoryPM (в той же доменной службе), а RIA Services позаботится об остальном.Были ли у вас проблемы с этим?

...