使用Unity.Mvc3与HierarchicalLifetimeManager和工作单元模式不再延迟加载

时间:2012-02-07 15:17:42

标签: asp.net-mvc-3 entity-framework dependency-injection entity-framework-4.1 unity-container

首先,我的UoW继承自DbContext。

我转而使用Unity.Mvc3并将此行添加到我的注册中:

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

一旦我转向此,我对实体框架的延迟加载似乎停止了工作。这是一个例子:

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

之前,Satuses被加载到上下文中
//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 :(得分:0)

您的Status属性不是虚拟的,因此实体永远不会被代理延迟加载,Unity或任何其他IoC容器对此没有影响。

你也直接使用Process构造函数 - 如果你创建了Process的实例,它就无法代理,延迟加载也无法工作。您必须在Create上使用DbSet<Process>工厂方法来获取代理实体。