【问题标题】:Automapper lazy loading. Entity frameworkAutomapper 延迟加载。实体框架
【发布时间】:2014-03-20 14:41:19
【问题描述】:

我有一个实体和一个视图模型

public class Order
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    [ForeignKey("DeliveryMethod")]
    public int DeliveryMethodId { get; set; }
    public virtual RouteDeliveryMethod DeliveryMethod { get; set; }
}

public class OrderViewModel
{
    public string Name { get; set; }
    public int? DeliveryMethodId { get; set; }
}

我的控制器接收视图模型并使用自动映射器将其映射回实体

[HttpPost]
public ActionResult GetQuote(OrderViewModel ordervm)
{
    Order order = Mapper.Map<Order>(ordervm);
    // Do something with the order...

    return View();
}

这一切都很好,但是在完成映射回 Order 对象后,它不会加载 DeliveryMethod,DeliveryMethodId 具有有效值,但 DeliveryMethod 始终为 null。

DeliveryMethod 不应该因为延迟加载而加载吗?

【问题讨论】:

    标签: entity-framework ef-code-first lazy-loading automapper


    【解决方案1】:

    Automapper 只查看映射的属性。如果您尚未将目标属性DeliveryMethod 映射到任何源属性,则在映射期间将不会被命中。如果没有执行属性 getter,则实体不是延迟加载的。

    但是即使这个属性被命中,它也不会被延迟加载。因为Automapper 将在映射期间创建Order 类的新实例。但是对于延迟加载,您需要 order proxy class 的实例,其中包含您的 DbContext。当您尝试读取相关实体的值时,此代理会加载相关实体。使用普通的 Order 类实例延迟加载无法工作。

    【讨论】:

    • 但是当我通过它的 getter 访问 DeliveryMethod 时它不应该加载,还是我完全误解了延迟加载的工作原理?
    • @Rumpetroll 查看我的最新更新 - 如果没有订单代理,您将无法加载导航属性
    • 嗯,有道理,谢谢。那么除了让我手动加载对象之外,还有其他选择吗?
    • @Rumpetroll 我建议手动加载它。我认为您的数据库查询不应依赖映射器配置。如果在映射过程中确实需要加载相关实体,可以使用 AutoMapper 的AfterMap 方法。但是你应该可以访问DbContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多