在自动化EF实体类型时限制延迟加载

时间:2011-12-06 11:00:44

标签: entity-framework automapper

民间, 我在服务层使用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分析来研究这个问题,但我会感谢任何输入都要沿着这条路线前进。 谢谢 ķ。

1 个答案:

答案 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。