自动映射器延迟加载。实体框架

问题描述 投票:0回答:2

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

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
2个回答
2
投票

Automapper 仅查看映射的属性。如果您尚未将目标属性

DeliveryMethod
映射到任何源属性,则在映射过程中不会命中它。如果不执行属性 getter,则实体不是延迟加载的。

但是即使这个属性被命中,无论如何也不会被延迟加载。因为

Automapper
会在映射过程中创建
Order
类的新实例。但对于延迟加载,您需要 order 代理类 的实例,其中包含您的
DbContext
。当您尝试读取相关实体的值时,此代理会加载相关实体。对于普通的
Order
类实例,延迟加载无法工作。


0
投票

在执行映射之前,您可以通过从 EF 分离(代理)数据实体 (

ordervm
) 来轻松解决问题:

[HttpPost]
public ActionResult GetQuote(OrderViewModel ordervm)
{
    // Detach the data object from EF prior to performing the mapping:
    dbContext.Entry(ordervm).State = EntityState.Detached;

   // The following mapping will no longer lazy load additional (mapped)
   // references unless they have already been (eager) loaded.
   // Additionally, the mapping will no longer raise an exception
   // if it attempts to lazy load additonal references after the 
   // database context has been disposed.


    Order order = Mapper.Map<Order>(ordervm);
    // Do something with the order...

    return View();

}

如果 dbContext 不在上面示例中的范围内,您可能需要事先在数据访问存储库中进行分离。

© www.soinside.com 2019 - 2024. All rights reserved.