我使用 AutoMapper 将 UI 模型转换为 POCO,然后使用 DataContractSerializer 将其序列化为 XML,以便保留它们之间的引用。
问题来了,在绘制地图时,这些实体之间的引用丢失.
UI 类相互引用,但映射过程为每个引用创建新实例,因此原始关系被破坏:(
让我解释:
我有 2 个 Person 类型的实体
Person
{
List<House> OwnedHouses
}
还有这 2 个物体
John谁拥有
Will谁还拥有
当 AutoMapper 正确映射每个 Person 时,但它也将 House1 映射为两个不同的实例时!!
所以我有两份 House1。约翰拥有他的 House1 (#1),威尔拥有他的 House1 (#2)。
他们不再有联系了。
有什么办法可以维持原来存在的关系呢?
Thanks.
编辑:实际上我所拥有的是这样的:
文档包含子文档列表。每个 ChildDocument 都有一个可设计列表(矩形、直线、椭圆...)和一个名为 ChildDocumentAdapter 的特殊可设计列表,其中包含另一个 ChildDocument。这就是麻烦了,它可以引用另一个ChildDocument。
如果我理解这个问题,那么您正在执行两个单独的映射操作 - 一个用于约翰,另一个用于威尔。
@Sunny 是对的。 AutoMapper 并不是为此而设计的。您拨打的每个电话Mapper.Map()
通常独立于任何其他。通过使用 HouseListConverter 的同一实例,您可以获得在字典中缓存所有映射房屋的好处。但是您必须全局注册它,或者将其作为选项传递给您想要分组在一起的映射调用。这不仅仅是额外的工作,它还隐藏了转换器深处非常重要的实现细节。
如果您在一个操作中同时映射 John 和 Will,通过将它们放入一个集合中,输出将是您想要的,而不需要自定义转换器或解析器。
对于其他有类似问题的人来说,这可能是一个更简单的选择。
public void MapListOfPeopleWithSameHouse()
{
Mapper.CreateMap<Person, PersonDTO>();
Mapper.CreateMap<House, HouseDTO>();
var people = new List<Person>();
var house = new House() { Address = "123 Main" };
people.Add(new Person() { Name = "John", Houses = new List<House>() { house } });
people.Add(new Person() { Name = "Will", Houses = new List<House>() { house } });
var peopleDTO = Mapper.Map<List<PersonDTO>>(people);
Assert.IsNotNull(peopleDTO[0].Houses);
Assert.AreSame(peopleDTO[0].Houses[0], peopleDTO[1].Houses[0]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)