Использование Unity.Mvc3 с HierarchicalLifetimeManager и шаблоном Unit Of Work больше не ленивая загрузка - PullRequest
3 голосов
/ 07 февраля 2012

Во-первых, мой UoW наследуется от DbContext.

Я перешел на использование Unity.Mvc3 и добавил эту строку в свои регистрации:

Container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());

Как только я перешел к этому, моя ленивая загрузка для Entity Framework, похоже, перестала работать. Вот пример:

public class Process
{
     public Guid Id {get;set;}
     public virtual Guid? StatusId {get;set;} //this is the FK EF uses.
     public virtual Status Status {get;set;}
}

public class Status
{
     public Guid ID {get;set;}
     public Name {get;set;}
}

//DTOs
public class ProcessDto
{
     public Guid Id {get;set;}
     public Guid? StatusId {get;set;} //this is the FK EF uses.
     public StatusDto Status {get;set;}
}

public class StatusDto
{
     public Guid ID {get;set;}
     public Name {get;set;}
}

Сатусы загружаются в контексте, прежде чем мы вызываем Cre

//Process Service
    public ProcessDto Create(ProcessDto dto)
    {
       var processEntity = new Process(){StatusId = dto.StatusId}
       processRepository.Add(processEntity)
       unitOfWork.Commit()
       //at this point, before using Unity.Mvc3 the Status would be proxied into the   processEntity. Moving to Unity.Mvc3 it is like Lazy Loading stopped working.
       return Mapper.Map<Process,ProcessDto>(processEntity);
    }

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

1 Ответ

0 голосов
/ 07 февраля 2012

Ваше свойство Status не является виртуальным, поэтому объект никогда не может быть прокси для отложенной загрузки, и Unity или любой другой контейнер IoC не влияют на это.

Также вы используете конструктор Process напрямую - если вы создаете экземпляр Process, он не может быть проксирован и ленивая загрузка не может работать. Вы должны использовать Create фабричный метод на DbSet<Process>, чтобы получить прокси-объект.

...