【问题标题】:Restricting lazy loading while automapping EF entity type在自动映射 EF 实体类型时限制延迟加载
【发布时间】:2011-12-06 11:00:44
【问题描述】:

各位, 我在我的服务层中使用 automapper 将 EF 对象映射到简单的 Pocos。我有某些实体在 EF 中有很多关系,但我想限制从数据库中拉回多少。其中一个实体将映射到数据库表,但与其他表有许多关系,这些关系将在生成的模型 (EDMX) 中显示为实体集合。

所以我为实体创建了一个“浅”poco,它仅具有实体中第一级属性的 poco 属性,即一些整数 Id,而不是关联的集合/实体集合。我按以下方式映射....

var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id),
                                    new SimplPocoForEntity());

我的问题是.. 因为我在这里只将实体映射到一个简单的 poco,我是否可以确信 EF 在我进行映射时不会尝试从基础数据库表关系中查询其他非引用数据?

我知道我可以通过 SQL Profiling 对此进行调查,但在沿着这条路线前进之前,我将不胜感激。 谢谢 K.

【问题讨论】:

    标签: entity-framework automapper


    【解决方案1】:

    这取决于 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2011-10-27
      • 2012-04-29
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多