我有一个Employers类,其中Addresses作为其中的属性,如下所示,以及相应的DTO的EmployeeDTO和AddressDTO
public class EmployeeDTO {
public string Name { get; set; }
public IList<AddressDTO> Addresses { get; set; }
}
public class Employee {
public virtual string Name { get; set; }
public virtual IList<Address> Addresses { get; set; }
}
我的AutoMapper Mappings不仅仅是这个,但为了方便起见,我只是展示直接映射。
Mapper.CreateMap<EmployeeDTO, Employee>();
Mapper.CreateMap<Employee, EmployeeDTO>();
Mapper.CreateMap<AddressDTO, Address>();
Mapper.CreateMap<Address, AddressDTO>();
在我的数据层中,我按名称获取一个Employee,然后将其转换为EmployeeDTO并将其传输到UI。 在UI中,我更改地址或向EmployeeDTO的地址添加新地址,并将其传回服务器以保持不变。 在Repository中,我从db获取现有Employee,然后使用AutoMapper更新对象。我使用AutoMapper的Map重载来提供相同的实体
TDestination Map<TSource, TDestination>(TSource source, TDestination destination);
var empObj = Mapper.Map<EmployeeDTO, Employee>(updatedDTO, empInDb);
我使用session的SaveOrUpdate来保持
_session.SaveOrUpdate(empObj);
提交此抛出异常说
&#34;具有相同标识符值的另一个对象已与会话关联:4,实体:地址&#34;
如果我使用_session.Merge它可以正常工作,但之前当我使用手动映射而不是AutoMapper时,它与&#39; session.SaveOrUpdate配合使用。&#39;
答案 0 :(得分:0)
不支持使用AutoMapper的复杂反向映射。映射集合很难。您必须合并两个集合,删除不存在的内容,添加新内容等。您还必须定义一些有关如何将现有源DTO与目标模型匹配的机制。
如果你手动编写反向代码,你会看到你的反对意见。不要反向映射复杂的对象,它不受支持,可能永远不会。