MVC 4, Upshot лица циклические ссылки - PullRequest
1 голос
/ 20 марта 2012

У меня есть DbDataController, который выдает список оборудования.

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.OrderBy(e => e.Name);
        return q;
    }

В моем представлении лесов все выглядит хорошо.

Но оборудование содержит член HashSet класса EquipmentType.Я хочу показать этот тип в своем представлении, а также иметь возможность добавлять данные в коллекцию EquipmentType Equipment (через список множественного выбора).

Но если я попытаюсь включить "EquipmentType" в мой запрос linq происходит сбой во время сериализации .

    public IQueryable<BettrFit.Models.Equipment> GetEquipment() {
        var q= DbContext.EquipmentSet.Include("EquipmentType").OrderBy(e => e.Name);
        return q;
    }

"Граф объектов для типа EquipmentType содержит циклы и не может быть сериализован, если отслеживание ссылок отключено"

Как включить "Возврат ссылок "?

Может быть, проблема в том, что EquipmentType имеет обратную ссылку через HashSet?Но я не включаю ("EquipmentType.Equipment") в свой запрос.Так что все должно быть в порядке.

Как Upshot генерирует модель?Я нахожу только файл EquipmentViewModel.js, но он не содержит членов модели.

Вот мои классы моделей:

public class Equipment
{
    public Equipment()
    {
        this.Exercise = new HashSet<Exercise>();
        this.EquipmentType = new HashSet<EquipmentType>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Picture { get; set; }
    public string Link { get; set; }
    public string Producer { get; set; }
    public string Video { get; set; }

    public virtual ICollection<EquipmentType> EquipmentType { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}
public class EquipmentType
{
    public EquipmentType()
    {
        this.Equipment = new HashSet<Equipment>();
        this.UserDetails = new HashSet<UserDetails>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Equipment> Equipment { get; set; }
    public virtual ICollection<UserDetails> UserDetails { get; set; }
}

Ответы [ 4 ]

2 голосов
/ 26 марта 2012

попробуйте украсить одно из свойств навигации с помощью [IgnoreDataMember]

[IgnoreDataMember]
public virtual ICollection<Equipment> Equipment { get; set; } 
0 голосов
/ 05 апреля 2012

Чтобы решить циклическую обратную ссылку, вы можете использовать атрибут IgnoreDataMember. Или вы можете установить обратную ссылку на NULL перед возвратом данных из DbDataController

Я опубликовал рабочее решение вашей проблемы в другом вопросе, но сначала использовал Entity Framework Code. https://stackoverflow.com/a/10010695/1226140

Здесь я покажу, как сгенерировать вашу модель на стороне клиента вручную, позволяя вам отображать данные, как вам угодно

0 голосов
/ 21 марта 2012

Я разобрался - частично, как решить проблему циклических ссылок.

Я просто перебрал свою запрашиваемую коллекцию (с помощью Include ()) и установил обратные ссылки для родителя на NULL.Это сработало для проблемы сериализации, которая в противном случае уже ломается на сервере.

Единственная проблема сейчас - это обновление объекта данных - его сбой, потому что массивы ссылочной коллекции объектов статичны ...

0 голосов
/ 21 марта 2012

Модель, сгенерированную с помощью upshot, можно найти на самой странице. В представлении «Индекс» вы увидите используемый UpshotContext помощник HTML (учитывая, что вы используете последнюю версию SPA), в котором указаны источник данных и тип модели.

Когда страница отображается в браузере, этот вспомогательный код заменяется фактическим определением модели. Чтобы увидеть это, просмотрите исходный код вашей страницы в браузере и найдите тег <script>, который начинается с upshot.dataSources = upshot.dataSources || {};

Проверьте здесь для получения дополнительной информации о том, как upshot генерирует модель на стороне клиента. Что касается "возврата ссылок", я не знаю :)

...