Как заставить RIA Services включить подобъект в один метод Query, а не в другой? - PullRequest
5 голосов
/ 28 апреля 2011

Вот сценарий:

У меня есть связь между «Группы» и «Пользователи», представленная объектом «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, которые возвращают назначения со свойствами User и Group, заполненными соответственно. Т.е. GetUserAssignmentsForGroup принимает GroupId и возвращает назначения для этой группы с заполненным свойством User.

То, что я хочу, это представить эти два метода как методы запроса домена следующим образом:

[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, службы RIA НЕ передают дочерние объекты (пользователя или группу) по проводам.

Я не хочу использовать атрибуты [Include] в свойствах User или Group класса UserAssignment, так как я хочу минимизировать полезную нагрузку по сети - я не хочу отправлять группу, когда я Например, интересует только пользователя каждого пользовательского задания.

Так что мой вопрос таков:

Как мне сообщить службам RIA явно включать юзеры в одном домене метод запроса и группы Субъекты в другом?

Помните, я использую NHibernate в качестве внутреннего и пользовательского методов запросов в RIA Services, поэтому не могу использовать стиль EF, включенный в запрос клиента.

Спасибо

Joel

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Вы должны применить атрибут [Include] в классе метаданных.затем создайте один метод службы домена для извлечения данных без включенных свойств и отдельный метод для извлечения данных с включенными свойствами.

этот поток может оказаться полезным для пониманиякак работает атрибут [Include].

0 голосов
/ 02 ноября 2011

Старый вопрос, но все еще интересный.Вы нашли решение?

Насколько я знаю об архитектуре WCF RIA, это не так просто.Простой и грязный способ может заключаться в переопределении метода Query, принудительном перечислении возвращаемого IQueryable (я полагаю, вы используете LINQ для nHibernate, в этом случае удачи), а затем исследует HttpContext (вы используете WCF RiaServicesтаким образом, вы ДОЛЖНЫ включить aspNetCompatibility) и установить нулевую ссылку, которую не хотите отправлять по проводам (пользователь или группа).В любом случае, таким образом вынудите вас использовать [IncludeAttribute].Однако я не вижу никакого разумного маршрута, который бы избегал его использования, и таким образом вы можете отправить объект по проводам именно тогда, когда вам это нужно.

IMO Я верю, что для того, чтобы полностью избежать использования [Включить], вы должны развернуть свой собственный серверный сериализатор и клиентскую десериализатор или изменить сущность UserGroupAssignment, чтобы свойство пользователя стало строкой, содержащей сериализованного пользователя (илиГруппа), которую вы решили оценить или нет согласно вашему методу.

Пожалуйста, дайте нам знать, если вы уже нашли решение, вопрос интересный.

...