当通过automapper映射子集合时,NHibernate的SaveOrUpdate抛出NonUniqueObjectException

时间:2014-12-19 05:11:52

标签: c# wcf nhibernate automapper soa

我有一个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;

  1. 当我使用AutoMapper进行地图绘制时出现了什么问题。我猜想在自动化器中,当它看到List和List之间的映射时,它只使用法线贴图。我们可以指定某个地方,以便AutoMapper使用Map的重载,以便它返回相同的实体。
  2. 我看到SaveOrUpdate和Merge之间的速度差异很小。无论如何要加快速度。

1 个答案:

答案 0 :(得分:0)

不支持使用AutoMapper的复杂反向映射。映射集合很难。您必须合并两个集合,删除不存在的内容,添加新内容等。您还必须定义一些有关如何将现有源DTO与目标模型匹配的机制。

如果你手动编写反向代码,你会看到你的反对意见。不要反向映射复杂的对象,它不受支持,可能永远不会。