Как получить полный объект с помощью Code First Entity Framework 4.1

Я пытаюсь вернуть в виде JSON полностью глубокий объект (со всеми заполненными отношениями внешнего ключа), но я получаю нули для всех объектов, на которые ссылаются.

Вот вызов для получения объекта:

    public ActionResult GetAll()
    {
        return Json(ppEFContext.Orders, JsonRequestBehavior.AllowGet);
    }

А вот и сам объект Order:

public class Order
{
    public int Id { get; set; }

    public Patient Patient { get; set; }

    public CertificationPeriod CertificationPeriod { get; set; }

    public Agency Agency { get; set; }

    public Diagnosis PrimaryDiagnosis { get; set; }

    public OrderApprovalStatus ApprovalStatus { get; set; }

    public User Approver { get; set; }

    public User Submitter { get; set; }

    public DateTime ApprovalDate { get; set; }

    public DateTime SubmittedDate { get; set; }
    public Boolean IsDeprecated { get; set; }
}

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

С уважением,

Гвидо

Обновить

Я добавил виртуальное ключевое слово в соответствии с Саксманом и теперь занимаюсь проблемой ошибки циклической ссылки.


person Guido Anselmi    schedule 07.04.2011    source источник
comment
Посмотрите здесь: stackoverflow.com/questions/4251794/, какой тип Enumerable является OrderApprovalStatus и т. д.   -  person TBohnen.jnr    schedule 07.04.2011


Ответы (2)


Добавьте ключевое слово virtual перед связанными сущностями:

public class Order
{
    public int Id { get; set; }

    public virtual Patient Patient { get; set; }

    public virtual CertificationPeriod CertificationPeriod { get; set; }

    public virtual Agency Agency { get; set; }

    public virtual Diagnosis PrimaryDiagnosis { get; set; }

    public virtual OrderApprovalStatus ApprovalStatus { get; set; }

    public virtual User Approver { get; set; }

    public virtual User Submitter { get; set; }

    public DateTime ApprovalDate { get; set; }

    public DateTime SubmittedDate { get; set; }
    public Boolean IsDeprecated { get; set; }
}

Вы можете получить ошибку A circular reference was detected while serializing an object..., если ваши объекты ссылаются друг на друга. В этом случае вам нужно будет создать ViewModel или что-то подобное, чтобы решить эту проблему. Или используйте LINQ для проецирования анонимного объекта.

person Saxman    schedule 07.04.2011
comment
Это дало прогресс, но теперь я там, где вы описываете. За исключением циклической ссылки. Я читаю о добавлении идентификатора постороннего объекта в модель и других решениях. - person Guido Anselmi; 07.04.2011
comment
На данный момент вы ничего не можете с этим поделать, сериализация с объектом, ссылающимся на другой объект, невозможна. Как я уже предлагал, вы можете создать ViewModel, которая будет иметь только те данные, которые вам нужны, или проецировать на анонимный объект, то есть: stackoverflow.com/questions/4436328/ - person Saxman; 08.04.2011

Прочтите о загрузке связанных объектов.

person archil    schedule 07.04.2011
comment
Моей первой мыслью было взглянуть на ленивую загрузку. - person Andrew Charlton; 07.04.2011
comment
Да, но если вам всегда нужно загружать каждое свойство, на которое ссылаются, явно писать Include с каждой загрузкой неудобно, возможно, есть другой способ настроить отложенную загрузку. - person archil; 07.04.2011