如何强制RIA Services将子实体包含在一个Query方法中,而不包含在另一个Query方法中

时间:2011-04-28 13:17:20

标签: nhibernate wcf-ria-services

以下是该方案:

我在“Groups”和“Users”之间建立了关联,由“UserGroupAssignment”对象表示。

public class UserGroupAssignment
{
  [Key]
  public virtual long Id { get; set; }

  [Association("UserAssignmentToUser", "UserId", "Id", IsForeignKey = true)]
  public virtual User { get; set; }  

  [Association("UserAssignmentToGroup", "GroupId", "Id", IsForeignKey = true)]
  public virtual Group { get; set; }    

  public virtual bool IsPrimary { get; set; }    

  public virtual DateTime? ValidFrom { get; set; }    

  public virtual DateTime? ValidTo { get; set; }    
}

我有两个业务逻辑方法,GetUserAssignmentsForGroups和GetGroupAssignmentsForUsers,我返回分配时分别填充用户和组属性的分配。即GetUserAssignmentsForGroup接受GroupId并返回该组的分配,并填充用户属性。

我想要的是将这两种方法公开为域查询方法,如下所示:

[Query]
public IQueryable<UserGroupAssignment> GetAssignmentsForGroupWithUsers(long groupId)
{
  return this.businessLogic.GetUserAssignmentsForGroups(groupId);
}

[Query]
public IQueryable<UserGroupAssignment> GetAssignmentsForUserWithGroups(long userId)
{
  return this.businessLogic.GetGroupAssignmentsForUsers(userId)
}

我的问题是,虽然业务逻辑方法通过NHibernate返回正确填充的Assignments,但RIA Services并未通过网络传递子实体(用户或组)。

我不想在UserAssignment类的User或Group属性上使用[Include]属性,因为我想通过线路最小化有效负载 - 我不想在我的时候发送组例如,仅对每个UserAssignment的用户感兴趣。

所以我的问题是:

  

如何告诉RIA服务   明确包含用户子实体   在一个域查询方法和组   另一个中的子实体?

请记住,我在后端使用NHibernate并在RIA Services中使用自定义查询方法,因此无法在客户端查询中使用EF样式包含。

由于

乔尔

2 个答案:

答案 0 :(得分:1)

您应该在元数据类中应用[Include]属性。然后创建一个域服务方法,用于获取不包含属性的数据,以及一个用于获取包含属性的数据的单独方法。

您可能会发现this thread有助于了解[Include]属性的工作原理。

答案 1 :(得分:0)

老问题,但仍然很有趣。你找到了解决方案吗?

据我所知,WCF RIA架构并不容易。 一个简单而肮脏的方法可能是覆盖Query方法,强制返回IQueryable的枚举(我猜你​​正在使用LINQ到nHibernate,在这种情况下,祝你好运)然后检查HttpContext(你正在使用WCF RiaServices)所以你必须打开aspNetCompatibility)并将你不想通过线路(用户或组)发送的引用设置为null。 无论如何这种方式强迫你使用[IncludeAttribute]。但是我没有看到任何合理的路由来避免使用它,这种方式允许您在需要时通过线路发送实体。

IMO我相信,为了完全避免使用[Include],您必须推出自己的序列化服务器服务器端和反序列化器客户端或更改UserGroupAssignment实体,以便用户属性成为包含序列化用户(或组)的字符串你决定根据你的方法加价或不加价。

请告诉我们您是否已找到解决方案,问题很有意思。