我有一些亲子关系的实体:家庭(父母)和更新(孩子)。我想阅读没有相应更新的家庭列表。只有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来重新组装汇编程序,所以如果可能的话,我宁愿不用手动修改汇编程序。
答案 0 :(得分:9)
我是Fabian, EntitiesToDTOs 的创建者。
首先,非常感谢您使用它。
您检测到的实际上是我不希望Assembler做的事情,我希望开发人员只在需要时使用部分方法 OnDTO 和 OnEntity来映射导航属性即可。否则你会遇到像你一样的问题。
似乎我从未遇到过使用该工具的问题,感谢很多。
所以现在我正在解决这个问题。现在已修复version 3.1。
答案 1 :(得分:1)
根据您在此处发布的代码,以及我认为有人会如何实施此类解决方案(即将记录转换为DTO格式),我认为您别无选择,只能进行急切加载。
一些关键点:
1)你的Updates_ID
字段显然是一个List,这意味着它正在为集合保持水分(ToList总是执行。只有常规的IEnumerable使用延迟执行)。
2)如果您在DTO中粘贴任何类型的导航属性,它将自动加载。这是因为一旦你触摸了由Entity Framework带回的导航属性,框架会自动从数据库中加载它,并不关心你想要的就是用它来填充DTO。