EntitiesToDTOs(实体框架DTO生成器)是否支持延迟加载?

时间:2013-03-04 22:04:08

标签: c# entity-framework code-generation add-in dto

我有一些亲子关系的实体:家庭(父母)和更新(孩子)。我想阅读没有相应更新的家庭列表。只有17个家庭,但大约有60,000个更新,所以我真的不想要更新。

我使用EntitiesToDTOs从Family实体生成DTO并创建用于将Family实体转换为FamilyDTO的汇编程序。汇编程序的ToDTO方法如下:

public static FamilyDTO ToDTO(this Family entity)
{
    if (entity == null) return null;

    var dto = new FamilyDTO();

    dto.FamilyCode = entity.FamilyCode;
    dto.FamilyName = entity.FamilyName;
    dto.CreateDatetime = entity.CreateDatetime;
    dto.Updates_ID = entity.Updates.Select(p => p.ID).ToList();

    entity.OnDTO(dto);

    return dto;
}

当我运行汇编程序时,我发现每个生成的FamilyDTO都填充了Updates_ID列表,尽管对于EF模型(edmx文件),延迟加载设置为true。是否可以配置EntitiesToDTOs以支持延迟加载子元素,还是始终使用预先加载?我在EntitiesToDTOs中看不到任何可以设置为在生成汇编程序时支持延迟加载的选项。

顺便说一句,我是一个大型团队的成员,他们几乎每天使用EntitiesToDTOs来重新组装汇编程序,所以如果可能的话,我宁愿不用手动修改汇编程序。

2 个答案:

答案 0 :(得分:9)

我是Fabian, EntitiesToDTOs 的创建者。

首先,非常感谢您使用它

您检测到的实际上是我不希望Assembler做的事情,我希望开发人员只在需要时使用部分方法 OnDTO OnEntity来映射导航属性即可。否则你会遇到像你一样的问题。

似乎我从未遇到过使用该工具的问题,感谢很多。

所以现在我正在解决这个问题。现在已修复version 3.1

答案 1 :(得分:1)

根据您在此处发布的代码,以及我认为有人会如何实施此类解决方案(即将记录转换为DTO格式),我认为您别无选择,只能进行急切加载。

一些关键点:

1)你的Updates_ID字段显然是一个List,这意味着它正在为集合保持水分(ToList总是执行。只有常规的IEnumerable使用延迟执行)。

2)如果您在DTO中粘贴任何类型的导航属性,它将自动加载。这是因为一旦你触摸了由Entity Framework带回的导航属性,框架会自动从数据库中加载它,并不关心你想要的就是用它来填充DTO。