gpt4 book ai didi

entity-framework - 防止 AutoMapper 投影强制加载相关数据

转载 作者:行者123 更新时间:2023-12-05 00:24:36 24 4
gpt4 key购买 nike

有没有办法配置 AutoMapper 以遵守 Entity Framework 的 .Include 样式加载说明?

我已经为我的上下文禁用了延迟加载,并且我想有条件地加载特定实体的相关数据。理想情况下,我想通过使用包含语法来做到这一点。就像是:

if(loadAddreses)
{
query = query.Include(e => e.Addresses);
}

if(loadEmails)
{
query = query.Include(e => e.Emails);
}

问题是,AutoMapper 看到我要投影的模型包括地址和电子邮件,并且正在生成加载所有数据的 SQL,而不管我要求 EF 包含什么。换句话说:
var model = query.Project.To<MyModel>();

如果 MyModel 有一个 Addresses 集合,它将加载地址,而不管我的 Include 语句。

如果没有更改我的模型,以便我拥有一个没有 Addresses 或 Emails 属性的模型,有没有办法解决这个问题?我想我可以更改我的映射,但映射通常是静态的,并且在最初创建后不会更改。

最佳答案

梳理起来有点棘手,但看看这对你有什么作用。请注意,我使用的是 AutoMapper 的 3.3.0-ci1027 版(在撰写本文时这是一个预发布版)。

假设我的数据模型如下所示:

public class Address
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AddressId { get; set; }
public string Text { get; set; }
}

public class Email
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int EmailId { get; set; }
public string Text { get; set; }
}

public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
public virtual ICollection<Email> Emails { get; set; }

public User()
{
this.Addresses = new List<Address>();
this.Emails = new List<Email>();
}
}

我的 View 模型没有指定,但它们只包含与实体相同的属性。

我的映射来自 UserUserViewModel看起来像这样:
Mapper.CreateMap<User, UserViewModel>()
.ForMember(x => x.Emails, opt => opt.ExplicitExpansion())
.ForMember(x => x.Addresses, opt => opt.ExplicitExpansion());

我的投影是这样的:
var viewModels = context.Set<User>().Project()
.To<UserViewModel>(new { }, u => u.Emails).ToList();

有了那个映射和投影,只有 Emails集合已加载。对此的重要部分是 opt => opt.ExplicitExpansion()调用映射 - 除非在投影期间显式扩展,否则会阻止跟随导航属性,以及重载 To方法。此重载允许您指定参数(我将其保留为空对象)以及您希望扩展的成员(在本例中仅是 Emails )。

在这个阶段我不确定的一件事是从 Include 中提取细节的精确机制。语句,以便您可以依次将它们传递到 To方法,但希望这能给你一些工作。

关于entity-framework - 防止 AutoMapper 投影强制加载相关数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25898237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com