RIA服务和多种/动态“包含”策略

时间:2010-04-27 03:44:51

标签: wcf include wcf-ria-services ria

举个例子,假设以下简单模型:

public class Order
{
    public List<LineItem> LineItems { get; set; }
    public List<Fee> Fees { get; set; }
}

public class LineItem { }
public class Fee { }

使用RIA服务,如果我想检索订单并在同一网络调用中包含所有订单项,我可以在上面的LineItems集合中静态放置[Include]属性。这对于单个场景非常有用,但是当我需要多个“包含策略”时会发生什么?

例如,一种情况可能要求包括费用集合而不是LineItems集合。 RIA服务有没有办法控制运行时包含的内容,而无需重新定义模型和/或使用为每个用例静态放置的属性创建dtos?

3 个答案:

答案 0 :(得分:0)

仅当实体框架(或您使用的任何内容)包含该属性时,

[Include]属性才有效。因此,虽然您无法根据当前场景设置[Include],但您可以通过在EF查询上设置.Include来控制包含哪些实体。因此,在您的DomainService上没有一个名为GetProducts的函数,您可能会有更多(GetProductsWithComments等)因EF查询中的包含设置而异(请参阅Jonx的答案)。

答案 1 :(得分:0)

最好用视图完成。如果您无法查看视图,则可以创建自己的POCO实体/类。

由于您的域模型中不存在POCO类,因此您需要做一些事情才能使它们与ria服务一起使用。

  1. 由于ria只是一种带有实体序列化的WCF,因此POCO类需要使用[DataContract]属性进行修饰。
  2. POCO类的任何成员都需要使用[DataMember]
  3. 进行修饰
  4. POCO类的至少一个属性需要具有[Key]属性(System.ObjectModel.DataAnnotations),并且必须是唯一的才能满足Key属性的验证。
  5. 最后,为了能够在您的服务中使用这些poco类,至少有一个服务方法必须返回该poco类的IEnumerable或IQueriable。

    了解这一点,您可以创建自定义对象来表示UI所需的内容层次结构。缺点是使用这些对象进行CRUD有点困难。这些对象更常用于显示。

    我还建议你将你的ria服务标记为部分,以及你编写的任何自定义服务代码,将其添加到另一个实现服务的部分类中....(将为你节省一个受伤的世界您正在更新您的域模型并重新生成wcf ria服务...)

答案 2 :(得分:-1)

你会这样做:

var product = _productRepository.GetProductSet()
.Include("Tags")
.Include("Attachments")
.Include("Comments")
.Include("Comments.User")
.Include("Comments.User.UserDetails")
.FirstOrDefault(p => p.ProductId == productId);