.NET 4, WCF REST Services, Entity Framework, Сериализация и циклические ссылки - PullRequest
1 голос
/ 06 августа 2010

Этот заголовок довольно полный.Позвольте мне попытаться быть максимально ясным ...

У меня есть служба WCF REST, написанная на .NET 4, которая использует инфраструктуру сущностей для извлечения некоторых данных из SQL Server в список объектов.Затем объекты возвращаются клиенту в виде XML.Проблема в том, что в XML есть ссылки друг на друга из-за отношений моей модели.

Вот некоторый код, помогающий проиллюстрировать проблему:

Моя модель: http://bara.stardock.com/images/activity_model.png

Класс Activity, который обрабатывает логику обслуживания:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Activities : IActivities
{
    public ActivitiesList GetActivities(string titleId, string accountId, string numToReturn)
    {
        stardockActivitiesEntities sdActivitiesDb = new stardockActivitiesEntities();

        int accountIdInt = int.Parse(accountId);

        List<Activity> items = (from a in sdActivitiesDb.Activities
                                join ab in sdActivitiesDb.ActivityBridges
                                    on a.ActivityID equals ab.ActivityID
                                where ab.AccountID == accountIdInt
                                select a).ToList();

        ActivitiesList list = new ActivitiesList(items);

        return list;
    }
}

Интерфейс для вышеуказанного класса:

[ServiceContract]
public interface IActivities
{
    [OperationContract]
    [WebGet(UriTemplate = "{titleId}/accounts/{accountId}/limits/{numToReturn}")]
    ActivitiesList GetActivities(string titleId, string accountId, string numToReturn);
}

Класс Activity автоматически создается структурой сущностей на основе моей модели для таблицы Activity.Однако я расширил этот класс, создав объект ActivityList:

[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
public partial class Activity
{

}

[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
[DataContract(IsReference=false)]
public class ActivitiesList
{
    [DataMember]
    public List<Activity> Activities { get; set; }

    public ActivitiesList()
    {
        Activities = new List<Activity>();
    }

    public ActivitiesList(List<Activity> list)
    {
        Activities = new List<Activity>();

        foreach (Activity item in list)
        {
            Activities.Add(item);
        }
    }

    public void Add(Activity a)
    {
        Activities.Add(a);
    }
}

Итак, чтобы снова объяснить мою проблему, мой XML, вместо того, чтобы просто возвращать список Activity, как следует, вместо этого возвращает списокДеятельность с некоторыми действиями, ссылающимися на другие действия, которые находятся в пределах основных действий.Это звучит странно, но посмотрите на изображения ниже:

Возвращенный XML: http://bara.stardock.com/images/activity_xml1.png

Упражнение со ссылкой «i8» относится к другому действию, которое фактически находится внутри действия сid "i2": http://bara.stardock.com/images/activity_xml2.png

Мой вопрос: как я могу удалить все эти дополнительные отношения из объекта Activity?Я бы предпочел, чтобы это был просто список Activity без вложенных ActivityType, EntityKey и т. Д., Которые автоматически генерируются структурой сущностей.

Надеюсь, я достаточно объяснил сам.А если нет, дайте мне знать, какие еще детали вы хотели бы видеть, и я предоставлю их.

Бара

Ответы [ 2 ]

1 голос
/ 20 августа 2010

Здесь есть два варианта, однако оба требуют немного работы.

Я бы порекомендовал создать классы-обертки, которые бы отображали соответствующие данные и возвращали их.

вернуть новый PersonWrapper () {Id = Person.Id, Name = Person.Name};

PersonWrapper нужны только автоматические свойства, и вы можете точно контролировать, какие данные вы возвращаете и как они возвращаются, используя соответствующие свойства.

Альтернативное предложение приходит из этого прохождения: http://blogs.msdn.com/b/endpoint/archive/2010/01/07/getting-started-with-wcf-webhttp-services-in-net-4.aspx

Это предполагает использование классов POCO (которые, опять-таки, вам придется создавать вручную) вместо того, чтобы полагаться на генерацию кода структуры сущностей, которая по соглашению (в большинстве случаев) сопоставляется с сущностями в вашей концептуальной модели (дополнительная информация здесь: http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx)

Второй вариант требует, чтобы вы выключили генерацию кода, поэтому, если вы планируете выставлять только несколько классов, вероятно, было бы болезненно создавать классы POCO вручную для каждой сущности, поэтому я бы рекомендовал создать классы-обертки только для объектов, которые нужно выставить

Martin

0 голосов
/ 07 августа 2010

Полагаю, если вы используете EF (4), вы можете удалить в модели (например, в дизайнере) ассоциации, которые вам не нужны / не нужны.Таким образом, генератор кода не генерирует свойства для навигации по отношениям.

Редактировать: Под ассоциациями я подразумеваю реальные "ассоциации" (линии на диаграмме) и свойства навигации (в нижней части сущностей).).

...