Сбой DbDataController в MVC4 UpdateEntity - PullRequest
1 голос
/ 21 марта 2012

У меня есть модель данных типа

ModelA, которая содержит коллекцию.

ModelB содержит коллекцию в качестве обратной ссылки.Это терпит неудачу из-за циклических ссылок, если я запрашиваю с «Включить» («ModelB»).Не хорошо, но я решил это, установив ModelB.List = null для каждого элемента.

Теперь проблема заключается в отправке измененного дерева ModelA: я добавляю сущности ModelB в ModelA.ModelB [].Теперь функция UpdateEntity жалуется на то, что не может добавить элементы типа ModelB, которые объявлены статическими.Десериализатор JSON создает статические массивы.

Как с помощью комбинации upshot / MVC4 можно отправлять модели данных, которые не являются полностью плоскими?Поскольку сейчас невозможно создать свои собственные объекты DTO, в которых вы могли бы выяснить, что я застрял сейчас ...

После более тщательного изучения ошибки я думаю, что проблема заключается в циклической обратной ссылке:

ModelA-> ModelB-> ModelA нарушает хранение данных.Msgstr "Не удалось добавить данные типа ModelA в тип ModelB".Как я уже упоминал, обратная ссылка была установлена ​​в Null, потому что проблема с сериализацией циклических ссылок ...

Я надеюсь, что будет несколько проще сделать больше вручную с объектами DTO, где у меня есть управление mroe.* См. Также: MVC 4, циклические ссылки на сущности Апшота для начала путешествия ...

1 Ответ

1 голос
/ 05 апреля 2012

Чтобы решить циклическую обратную ссылку, вы можете использовать атрибут ignoreDataMember:

public class Customer
{
    [Key]
    public int CustomerId { get; set; }

    public string Name { get; set; }
    public string Address { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }

    public virtual ICollection<Delivery> Deliveries { get; set; }
}

public class Delivery
{
    [Key]
    public int DeliveryId { get; set; }
    public string Description { get; set; }
    public bool IsDelivered { get; set; }

    [IgnoreDataMember]
    public virtual Customer Customer { get; set; }
    public virtual int CustomerId { get; set; }
}

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

...