我有一种情况,我以一种通用类型的方式传递一个现有对象以进行复制。我有一个带有dto类匹配集的实体层次树,如下所示: 计划 ->角色 -------->功能//多对多关系。
这些功能具有多对多关系。复制时,我将遍历计划和角色ID,并将其重置为0。这时,多对多关系中断了。另外,该映射不起作用,因为在插入时不会重新创建角色ID。为了使保存生效,必须忽略这些功能。因此,忽略后的我的实体看起来像这样。
计划
--->角色
Dto仍然像这样:
PlanDto
-------- RoleDto
---------------- FeaturesDto
接下来,我需要发送PlanDto和RoleDto的更新副本,以便自然运行:
return Mapper.Map(plan, plandto);
特征集合在源对象上为null,而目标集合具有原始的多对多项目。没关系,因为没有FeatureDto.RoleId属性,所以很多对很多项目都没有匹配的角色ID。计划和角色将具有新的ID,然后我可以针对旧功能列表和新的角色ID进行调用 _planService.AddRoleFeatures(plandto);
public void AddRoleFeatures(PlanDto plandto)
{
foreach(var role in plandto.Roles)
foreach(var feature in role.Features) { feature.RoleId = role.Id; }
}
我的映射器现在可以工作,因为我将FeatureDto项映射到正确的多对多表项,并且角色ID现在正确。 我在AutoMapper中到处都看过,当源类型为null时,似乎没有什么可以让我在目标类型上保留集合。不过,似乎很多事情都有望使所有结果导致三个问题之一:错误,空值,空集合。
我看了看AutoMapper.Collections包,但看起来它似乎是为合并列表而准备的,当集合不存在时,它不会按需要保留目标列表。