【发布时间】:2016-11-14 11:13:54
【问题描述】:
有没有办法配置 AutoMapper 以遵守 .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 语句。
没有改变我的模型,让我有一个没有地址或电子邮件属性的模型,有没有办法解决这个问题?我想我可以更改我的映射,但映射通常是静态的,并且在最初创建后不会更改。
【问题讨论】:
-
对于您正在处理的每个场景都有不同的映射怎么样?我意识到这可能并不理想,但 Automapper 将根据您的投影生成表达式树,因此如果您不忽略某些内容,它将包含在数据库查询中。
-
这用于通用查询对象模式,我称之为查询规范模式。这个问题的主要目标是看看我是否可以让模式“更安全”。
-
“更安全”,您的意思是要避免Automapper加载您不想加载的相关集合的情况吗?
-
是的。我想允许投影,但只允许那些是我选择公开的数据子集的那些。
-
所以回到我原来的评论,您是否愿意接受使用多个映射的建议,以便您可以涵盖每个场景?
标签: entity-framework automapper