我有一个实体和一个视图模型
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 不应该加载吗?
Automapper 仅查看映射的属性。如果您尚未将目标属性
DeliveryMethod
映射到任何源属性,则在映射过程中不会命中它。如果不执行属性 getter,则实体不是延迟加载的。
但是即使这个属性被命中,无论如何也不会被延迟加载。因为
Automapper
会在映射过程中创建 Order
类的新实例。但对于延迟加载,您需要 order 代理类 的实例,其中包含您的 DbContext
。当您尝试读取相关实体的值时,此代理会加载相关实体。对于普通的 Order
类实例,延迟加载无法工作。
在执行映射之前,您可以通过从 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 不在上面示例中的范围内,您可能需要事先在数据访问存储库中进行分离。