0

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

我使用EntitiesToDTO从 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。是否可以将 EntitiesToDTO 配置为支持子元素的延迟加载,还是总是使用急切加载?我在 EntitiesToDTOs 中看不到任何可以设置为在生成汇编程序时支持延迟加载的选项。

顺便说一句,我是一个更大的团队的一员,该团队几乎每天都使用EntitiesToDTO来重新生成汇编器,所以如果可能的话,我宁愿不要手动修改汇编器。

4

2 回答 2

9

我是EntitiesToDTOs的创建者 Fabian 。

首先,非常感谢您使用它

您检测到的实际上是我不希望汇编程序执行的操作,我希望开发人员仅在需要时使用部分方法OnDTOOnEntity映射导航属性。否则你会遇到像你一样的问题。

似乎我从未使用该工具遇到过这个问题,非常感谢。

所以现在我正在解决这个问题。它现在已在3.1 版本中修复。

于 2013-03-05T00:43:35.640 回答
1

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

一些关键点:

1)您的Updates_ID字段显然是一个列表,这意味着它会立即对集合进行水合(ToList 始终执行。只有常规的 IEnumerable 采用延迟执行)。

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

于 2013-03-04T22:10:18.187 回答