Решить круговую ссылку в WCF из моих POCO - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть пара классов (на данный момент), и я пытаюсь очистить циклическую ссылку между ними, так как это убивает сериализацию WCF.

Я использую EF с POCO в службе REST WCF, это помогает. Я упростил мою задачу до голых костей для простого примера здесь:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Groups
{
    [WebGet(UriTemplate = "")]
    public Message GetCollection()
    {
        var message = new Message { Body = "Test message" };
        var group = new Group { Title = "Title of group" };
        message.Group = group;
        group.Messages = new List<Message> { message };
        return message;
    }
}

public class Message
{
    public string Body { get; set; }
    public Group Group { get; set; }
}

[DataContract(IsReference = true)]
public class Group
{
    public string Title { get; set; }
    public ICollection<Message> Messages { get; set; }
}

Я добавил [DataContract(IsReference = true)] в класс Group, чтобы очистить циклическую ссылку, однако мои возвращаемые результаты в итоге выглядят так:

<Message xmlns="http://schemas.datacontract.org/2004/07/LmApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Body>Test message</Body>
    <Group z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"/>
</Message>

Где находятся свойства группы и как их получить?

Ответы [ 3 ]

0 голосов
/ 05 января 2011

Я решил создать свои собственные меньшие классы, в которых есть конструктор, который принимает сущность и правильно устанавливает все эти облегченные свойства.

По сути, это очень маленькая копия класса, имеющая только те свойства, которые необходимы для полезной нагрузки. (Очевидно, я исключил проблему со свойствами навигации)

0 голосов
/ 20 октября 2016

Это похоже на Циркулярные ссылки и WCF Вот мой ответ, измененный для этого случая

У меня была та же проблема, и я решил ее, исключив свойство навигации обратно из родительского объекта изDataContract

[DataContract]
public partial class Message
{

        [DataMember]
        public virtual string Body { get; set; }

        [DataMember]
        public virtual Group Group { get; set; }

}

[DataContract]
public partial class Group
{
        [DataMember]
        public virtual string Title { get; set; }

        public virtual ICollection<Message> Messages {get; set;}
}
0 голосов
/ 02 декабря 2010

BritishDeveloper,

Нет свойств, связанных с группой.Вот почему все, что вы видите, это идентификатор 1.

Причина в том, что как только вы аннотируете класс Group с помощью [DataContract (IsReference = true)], вы сообщаете сериализатору DataContract, что он больше не являетсяТип POCO.Это тип DataContract.

Итак, чтобы сериализовать Group со свойствами, теперь вам нужно пойти дальше и аннотировать свойства Title и Message с помощью DataMemberAttribute.

Альтернативой будет использование «preserveObjectReferences»., который вы можете передать в качестве параметра DataContractSerializer, DataContractSerializerOperationBehavior и другим классам.

Надеюсь, это поможет!

...