Служба RIA на основе объектов POCO не может десериализовать связанные объекты - PullRequest
0 голосов
/ 01 февраля 2011

Я разрабатываю бизнес-приложение Silverlight, используя службу RIA, которая возвращает объекты POCO (TaskTime и User). С сущностью TaskTime связан объект User.

Я создал доменную службу, которая имеет функцию запроса (GetTimesheet), которая возвращает коллекцию IQueryable сущностей TaskTime, которая отлично работает, если я не пытаюсь также получить связанные сущности пользователя, но как только я включаю атрибуты [Include] и [Association] над свойством «User» в сущности «TaskTime». Я начинаю получать ошибки десериализации, говоря:

Средство форматирования выдало исключение при попытке десериализации сообщения [...] Сообщение InnerException было «Ошибка в строке 1, позиция 266. Элемент» http://schemas.microsoft.com/2003/10/Serilaization/Arrays:anyType' связывается с данными контракта данных http://schemas.datacontract.org/2004/07/Timesheets.Entities:User'. Десериализатор не знает ни одного типа, который соответствует этому контракту. Добавьте соответствующий «Пользователь» в список известных типов ... '

Предполагается, что я использую атрибут 'KnownTypes', но я не могу найти место для размещения того, что устраняет эту ошибку.

Кто-нибудь знает, как решить эту проблему? В «Сгенерированном коде» моего приложения Silverlight я вижу, что оба типа, кажется, созданы правильно, с добавленными атрибутами DataContract и т. Д.

Упрощенные версии моих объектов POCO:

public partial class TaskTime
{
    [Key()]
    public virtual int ID   { get; set; }

    public virtual int User_ID  { get; set; }

    [Include]
    [Association("TaskTime_User", "User_ID", "ID", IsForeignKey=true)]
    public virtual User User
    {
        get { return _user; }
        set
        {
            if (!ReferenceEquals(_user, value))
            {
                var previousValue = _user;
                _user = value;
                FixupUser(previousValue);
            }
        }
    }
}

public partial class User
{
    [Key()]
    public virtual int ID   { get; set; }

    public virtual string Name  { get; set; }
}

1 Ответ

0 голосов
/ 18 февраля 2011

Вероятно, это связано с тем, что в вашем DomainService нет методов для операций CRUD в классе User (я полагаю, поскольку вы не предоставили код для своей службы).

В RIA, если вы хотите предоставить тип клиенту, вы должны сделать одно из двух:

(A) Предоставить CRUD-операции для этого типа в службе

-или-

(B) Используйте атрибут [Composition] родительского класса (в данном случае, вашего класса TaskTime).

Атрибут [Composition] делает так, что RIA будет предоставлять только операции CRUD классу User через своего родителя - таким образом, класс User не будет иметь своих собственных операций CRUD над Сервисом и, следовательно, может быть обновлен толькочерез родительский класс.

Какой путь вы выберете, зависит от того, как вы хотите, чтобы ваше приложение функционировало.В некоторых случаях [Композиция] подходит.

...