AutoMapper,如何在映射对象之间保持引用?

Sup*_*JMN 6 c# model reference poco automapper

我正在使用AutoMapper将UI模型转换为POCO,之后我使用DataContractSerializer将其序列化为XML,以便保留它们之间的引用.

问题是,在映射时,这些实体之间的引用会丢失.

UI类相互引用,但映射过程为每个引用创建新实例,因此原始关系被破坏:(

让我解释:

我有2个Person类型的实体

    Person 
    { 
        List<House> OwnedHouses 
    }
Run Code Online (Sandbox Code Playgroud)

而这2个对象

约翰 谁拥有

  • House1

请问 谁也拥有

  • House1

当AutoMapper正确映射每个Person时,但它也将House1映射为两个不同的实例!!

所以我有两份House1.John拥有他的House1(#1)并且Will拥有他的House1(#2).

他们不再联系了.

有没有办法保持最初存在的关系?

谢谢.

编辑:其实我的拥有是这样的:

文档包含ChildDocuments列表.每个ChildDocument都有一个Designables列表(Rectangles,Lines,Ellipses ...)和一个特殊的可设计名为ChildDocumentAdapter,它包含自己的ANOOTHER ChildDocument.这是麻烦,它可以引用另一个ChildDocument.

图

小智 5

如果我理解这个问题,那么您正在执行两个单独的映射操作 - 一个用于约翰,另一个用于威尔。

@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]);
}
Run Code Online (Sandbox Code Playgroud)