Циркулярные ссылки не допускаются - Json сериализация - PullRequest
0 голосов
/ 13 августа 2011

Я занимаюсь разработкой приложения с использованием кода Entity Framework 4.1 и MVC3. Вот три объекта, которые у меня есть, в основном, State => City => Locality.

public class State {
    public virtual List<City> Cities { get; set; }
}

public class City {
    public virtual List<Locality> Localities { get; set; }
    public virtual State State { get; set; }
}

public class Locality {
    public virtual City City { get; set; }
}

Видно, что я использую двунаправленные отношения для всех трех сущностей. Джсон этого не допускает, поэтому я несколько расстроен. По сути, мне нужно ориентироваться в любом направлении. Например, учитывая город, я хочу иметь возможность легко найти штат, к которому он принадлежит.

Я просканировал сеть и наткнулся на пару обходных путей, но ни один из них не подходит моему сценарию. Первым было сделать отношения однонаправленными (кто это сделает!), А я этого не хочу. Другим было представить ViewModel только с теми свойствами, которые мне нужны, но тогда это означало бы дублирование кода, если мне нужно регулярно использовать все поля Entity. Также мой контроллер будет залит этими свойствами. Так что мне это тоже не нравится.

Я думал, что это просто базовые вещи, но сейчас я изо всех сил пытаюсь найти работоспособное решение. Если у кого-то есть лучшая альтернатива (возможно, что-то в MVC3), пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 13 августа 2011

Вы можете попробовать использовать JavaScriptSerializer напрямую и зарегистрировать свой собственный конвертер для управления процессом сериализации.

0 голосов
/ 14 августа 2011

Проблема, по-видимому, связана с поддержкой DataContractJsonSerializer для типов сущностей.Вкратце, сущности, имеющие отношения (то есть двусторонние) с другими типами сущностей, не могут быть сериализованы через Json.В вашем примере: таблица состояний, связанная с таблицей городов, не будет хорошо преобразовываться в сериализацию Json, поскольку в штате может быть много городов, а город связан с государством.

Одним из быстрых решений будет проекция анонимного объекта.Пример примерно такой:

public JsonResult Orders()
    var results = from Ord in databaseContext.Orders
          select new
          {
              OrderID = Ord.ID,
              OrderTitle = Ord.Name,
              OrderDate = Ord.OrderDate
          }

    return Json(results);
}

. Для справки смотрите: Сериализация объектов Entity Framework в JSON с использованием ASP.Net MVC

0 голосов
/ 13 августа 2011

Я не эксперт по ASP, но я думаю, что решение может быть похоже на то, что я буду делать на Java, Groovy или Python или любом другом языке.

Лучшее решение, которое я мог бы предложить, - это сделать City.Localities своего рода «переходным» (в терминах Java) полем - то есть не сериализовать его, а обновлять во время загрузки (когда вы строите структуру). Это может быть заключено в сеттер для класса City of the Locality. Поэтому в Locality.setCity в методе set вы должны вызывать (city-> localities.append (this) (на каком бы языке вы его не написали). Таким образом, он станет «кэшем времени выполнения» для City-> Localities, который будет построить один раз во время загрузки.

...