【问题标题】:RIA Services and multiple/dynamic "Include" strategiesRIA 服务和多重/动态“包含”策略
【发布时间】:2010-04-27 03:44:51
【问题描述】:

例如,假设以下简单模型:

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

public class LineItem { }
public class Fee { }

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

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

【问题讨论】:

    标签: wcf include wcf-ria-services ria


    【解决方案1】:

    [Include] 属性仅在实体框架(或您使用的任何内容)包含该属性时才有效。因此,尽管您无法根据当前场景设置 [Include],但您可以通过在 EF 查询中设置 .Include 来控制包含哪些实体。因此,您可能会拥有更多(GetProductsWithComments 等),而不是您的 DomainService 上一个名为 GetProducts 的函数,这些函数会因 EF 查询中设置的包含而有所不同(请参阅 Jonx 的回答)。

    【讨论】:

      【解决方案2】:

      最好使用视图来完成。如果你不能做视图,你可以创建自己的 POCO 实体/类。

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

      1. 由于 ria 只是一种具有实体序列化的 WCF 形式,因此 POCO 类需要使用 [DataContract] 属性进行修饰。
      2. POCO 类的任何成员都需要用 [DataMember] 进行修饰
      3. POCO 类的至少一个属性需要具有 [Key] 属性 (System.ObjectModel.DataAnnotations) 并且必须是唯一的以满足 Key 属性的验证。

      最后,为了能够在您的服务中使用这些 poco 类,至少一个服务方法必须返回该 poco 类的 IEnumerable 或 IQueriable。

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

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

      【讨论】:

        【解决方案3】:

        你会这样做:

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

        【讨论】:

        • RIA 意义上的 Include 与 EF 意义上的 Include 具有不同的含义。在 EF 中,它的意思是“从数据库中检索时包含”;在 RIA 中,它的意思是“为客户端序列化时包含”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多