Silverlight PresentationModel包含另一个presentationModel的集合

时间:2012-03-11 14:59:53

标签: silverlight wcf-ria-services

我在Chris Anderson的Silverlight 4中阅读了Pro Business Application, 关于从服务器公开数据的主题:使用WCF RIA服务 - 表示模型类型,不是关于表示模型对象的详细信息包含暴露另一个表示模型对象的集合的属性。

我对如何创建presentationModel有基本的想法, 但是PresentationModel如何包含另一个PresentationModel的集合? 示例ProductPM包含ProductInventoryPM的集合? 如何在域服务类中编写CRUD代码?

谢谢!

3 个答案:

答案 0 :(得分:1)

您需要在代码中执行几项操作。首先,为了能够看到产品库存记录列表,您需要选择它们作为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对象创建一个空的Insert域操作。其中不需要逻辑,但需要使用该方法才能将ProductInventoryPM对象添加到ProductPM的库存集合中。

    Public Sub InsertProductInventory(ByVal ProductInventoryPM As ProductInventoryPM)
    
    End Sub
    

    注意:如果您希望在创建产品+初始库存记录后能够添加新的库存记录,那么您将需要在此域操作中添加逻辑。

  2. 在ProductPM的“插入域”操作中插入清单对象。这样做的一个优点是不需要调用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
    
  3. 现在,如果你运行它,一切都应该正常。让我知道它是怎么回事。

    克里斯

答案 1 :(得分:0)

相关类型的CRUD方法与主要类型完全相同。在本书的SL4版本中,标题为“更新您的演示模型类型”一节的底部有一个注释,其中讨论了这一点。基本上,您只需为ProductInventoryPM模型(在同一域服务中)编写Get,Update,Insert和Delete方法,RIA Services将负责其余的工作。你有没有遇到任何问题?

答案 2 :(得分:0)

非常感谢,它工作正常。

我已经修改了ProductInventoryPM对象的Insert域操作,如下所示,因此可以将新的ProductInventory记录添加到现有产品中。

  

Public Sub InsertProductInventory(ByVal ProductInventoryPM As ProductInventoryPM)

     

如果ProductInventoryPM.ProductID<> 0然后

     

Dim productInventory As New ProductInventory
  有了productInventory        .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 Sub