民间, 我在服务层使用automapper将EF对象映射到简单的Pocos。我有一些在EF中有许多关系的实体,但我想限制从db中撤回多少这些实体。其中一个实体将映射到数据库表,但与其他表有很多关系,这些表将在生成的模型(EDMX)中显示为实体集合。
所以我为实体创建了一个“浅层”poco,它只有实体中第一级属性的poco属性,即一些整数ID而不是相关的集合/实体集合。我按以下方式绘图......
var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id),
new SimplPocoForEntity());
我的问题是..因为我只在这里将实体映射到一个简单的poco,我可以确信当我进行映射时,EF不会尝试从底层数据库表关系中查询其他非引用数据吗?
我知道我可以通过SQL分析来研究这个问题,但我会感谢任何输入都要沿着这条路线前进。 谢谢 ķ。
答案 0 :(得分:2)
这取决于AutoMapper的内部实现。我假设AutoMapper不会尝试访问实体的导航属性(在这种情况下,延迟加载和其他数据库查询会启动)。如果你只映射标量属性,我没有看到为什么AutoMapper应该这样做的原因。但谁知道......
如果您想要安全起见,可以暂时禁用延迟加载:
try
{
_readOnlyDb.ContextOptions.LazyLoadingEnabled = false;
var simplepocoforentity = Mapper.Map(_readOnlyDb.Entities
.Single(x => x.Id == Id), new SimplPocoForEntity());
// ...
}
finally
{
_readOnlyDb.ContextOptions.LazyLoadingEnabled = true;
}
作为旁注:请注意,使用此方法将完整实体加载到上下文中。之后映射发生。您可能会从数据库中加载比实际需要更多的列(可能不是在您的特殊情况下)。通常,我会使用投影进行映射,以确保数据库仅查询所需的列:
var simplepocoforentity = _readOnlyDb.Entities
.Where(e => e.Id == Id)
.Select(e => new SimplPocoForEntity
{
PocoProperty1 = e.EntityProperty1,
PocoProperty2 = e.EntityProperty2,
PocoProperty3 = e.EntityProperty3
// etc.
})
.Single();
使用这种方法根本不会发生延迟加载,因为你没有加载实体,而是直接加载数据库中的PocoForEntity。