OpenRasta Json возвращает вложенные классы - PullRequest
1 голос
/ 06 июня 2011

Можно ли вернуть вложенные классы в json с помощью OpenRasta?

Сначала я использую EF4.1 с кодом (что в теории не должно иметь значения, поскольку они являются просто классами POCO).

Вот пример:

public class AppUser
{
    [Key]
    public int AppUserId { get; set; }
    public string WinLogin { get; set; }
    public string ScreenName { get; set; }
    public string AgencyId { get; set; }

    public virtual ICollection<UserAppVersion> UserAppVersion { get; set; }
}

public class UserAppVersion
{
    [Key]
    public int UaVersionId { get; set; }
    public int AppUserId { get; set; }
    public int AppVersionId { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateUpdated { get; set; }

    public virtual AppUser User { get; set; }
    public virtual AppVersion Version { get; set; } 
}

Я пытаюсь вернуть AppUser запись в формате json, используя это:

ResourceSpace.Has.ResourcesOfType<AppUser>()
    .AtUri("/user").HandledBy<UserHandler>().AsJsonDataContract();

Но я получаюошибка:

1014 * System.Runtime.Serialization.SerializationException: Тип 'System.Data.Entity.DynamicProxies.UserAppVersion_FD8D86F0A3AE39A0C370918637C1A90AD8D3ACA3E149677EA82C0A8D10ED0F8D' с именем контракта данных «UserAppVersion_FD8D86F0A3AE39A0C370918637C1A90AD8D3ACA3E149677EA82C0A8D10ED0F8D: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' не ожидается.Попробуйте использовать DataContractResolver или добавить любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer.

К сожалению, я нене знаю, как решить эту проблему.Есть предложения?

1 Ответ

3 голосов
/ 06 июня 2011

Это проблема контракта с данными, а не открытая версия.

DataContract serialzier видит динамический прокси-сервер, вероятно, сначала сгенерированный кодом EF, и при обнаружении, что не может отобразить объект.

Я бы порекомендовал либо заменить другой кодек serialziation, либо отключить прозрачную отложенную загрузку, либо альтернативно пометить ваше свойство как игнорирующее для serialziation, а другое свойство должно быть напечатано в List, чтобы сериализатор мог функционировать.

См. Ошибка DataContractSerializer при использовании Entity Framework 4.0 с WCF 4.0

...