EF 4.1 POCO Доступ к свойствам навигации после Db.Entry () - PullRequest
0 голосов
/ 06 июля 2011

Проблема

Не уверен, что правильный способ сделать это ... У меня есть простой класс:

public partial class Event
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int? PreviousEventId { get; set; }
    public virtual Event PreviousEvent { get; set; }
}

В моем проекте MVC 3 у меня есть форма, котораяиспользуется для редактирования описания события и (дополнительно) выбора предыдущего события из раскрывающегося списка.Форма отправляется в действие и, как обычно в MVC 3, автоматически сопоставляется с Event:

[HttpPost]
public ActionResult SaveEvent(Event myEvent)
{
    if (ModelState.IsValid)
    {
        Db.Entry(myEvent).State = EntityState.Modified;
        // do some additional checks
        Db.SaveChanges();
    }
}

. Я хотел бы выполнить дополнительную проверку, для которой требуется доступ к PreviousEvent, прежде чем сохранятьмоя сущностьТем не менее, свойство навигации всегда null, когда я обращаюсь к нему в коде выше.Это имеет смысл - форма отображается непосредственно в мой класс POCO, Event, а не в его прокси, созданный EF.

Вопрос

Есть ли способ поменять местами мой измененный Event для его прокси, чтобы EF мог помочь с загрузкой его навигационных свойств?Я мог бы сделать:

Db.Entry(myEvent).Reference(e => e.PreviousEvent).Load();
// do some checking on myEvent.PreviousEvent

... но загрузка всех свойств навигации таким способом кажется обыденной (в этом классе гораздо больше, чем показано), и я надеюсь, что в EF есть лучший способ сделать это,Действительно ли это?

1 Ответ

1 голос
/ 06 июля 2011

То, что вы просите, - это поддержка отложенной загрузки экземпляров сущностей, передаваемых вашим действиям. Ленивая загрузка обеспечивается через динамический прокси (= динамически создаваемый производный тип), созданный EF. Как только экземпляр создан без прокси, он не может использовать отложенную загрузку и не может быть изменен, чтобы разрешить его!

Чтобы создать экземпляр с поддержкой отложенной загрузки, необходимо использовать:

Event event = context.Events.Create();

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

Event event = new Event();

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

После того, как вы получили прокси-экземпляр, вы можете просто прикрепить его к контексту, и ленивая загрузка должна работать для вас.

...