Ao usar DTOs, o Automapper & Nhibernate refletem alterações nas coleções filho do DTO no objeto de domínio que está sendo atualizado

Não estou muito familiarizado com esse design, mas espero obter algumas orientaçõe

Tenho um serviço de back-end que envia DTOs para um cliente inteligente do WPF. No cliente inteligente WPF, o usuário altera, exclui e modifica itens e, em seguida, as alterações são enviadas de volta (cliente -> servidor). Como exemplo, atualmente estou trabalhando no formulário Detalhes do cliente e o usuário pode adicionar, remover e alterar categorias pertencentes a um cliente em um datagrid. Quando o DTO é enviado de volta ao servidor, eu gostaria de carregar o objeto de domínio relacionado ao ID no DTO e aplicar as alterações feitas no DTO ao objeto de domínio, incluindo todas as coleções filh

Eu tentei fazer algo semelhante a isso no código abaixo com o UpdateCustomer método. No entanto, acho que estou muito errado. Quando o código é executado em vez de terminar com uma lista de {Individual, Empresa, ONG, Governo} Acabo com uma lista de {Individual, B2B, Empresa, ONG, Governo}, pois claramente não excluiu a entrada B2B da lista origina

Uma opção que me ocorreu é percorrer a coleção DTO e compará-la com a coleção do objeto de domínio e adicionar, remover e atualizar dependendo do que foi modificado. No entanto, isso parecia realmente complicad

O que eu preciso fazer para aplicar as alterações do DTO nas coleções filho no meu objeto de domínio?

Muito obrigado por qualquer ajuda, será muito apreciado

Alex

    public class Customer
        {
            public virtual int Id { get; set; }
            public virtual IList<Category> Categories { get; private set; }
            public virtual string Code { get; set; }
            public virtual string Description { get; set; }

            public Customer()
            {
                Categories = new List<Category>();
            }

            public virtual void AddCategory(string categoryName)
            {
                Categories.Add(new Category(categoryName));
            }
        }

        public class Category
        {

            public virtual string CategoryName { get; private set; }
            public virtual Customer Customer {get;set;}
            public virtual int Id { get; set; }

            protected Category(){}

            public Category(string name)
            {
                CategoryName = name;
            }
        }
    }

    public void SetUpAutoMapper()
    {
        Mapper.CreateMap<Category, CategoryDto>();
        Mapper.CreateMap<Customer, CustomerDto>();
        Mapper.CreateMap<CategoryDto, Category>();
        Mapper.CreateMap<CustomerDto, Customer>();
        Mapper.AssertConfigurationIsValid();
    }
       public void SaveCustomer()
        {
            var customer = new Customer{Code="TESTCUST",Description="TEST CUSTOMER"};
             customer.AddCategory("Individual");
             customer.AddCategory("B2B");
             customer.AddCategory("Healthcare");
             customer.AddCategory("NGO");
             repository.Save(customer);
        }

     public CustomerDto GetCustomer(int customerId)
     { 
        var customer = repository.GetCustomer(customerId);
        var customerDto = Mapper.Map<Customer,CustomerDto>(customer);
        return customerDto;
     }

    public void UpateCustomer(CustomerDto customerToUpdate)
    {
        /*imagine that the dto incoming has had the following operations performed on it
        -----add new category----
        customerToUpdate.Categories.Add(new CategoryDto {CategoryName = "Government"});
        ---update existing category---
        customerToUpdate.Categories[2].CategoryName = "Company";
        ---remove category---
        customerToUpdate.Categories.RemoveAt(1);*/

        var customer = repository.GetCustomer(customerToUpdate.Id);
        /* How in this bit do I ensure that the child collection changes are
        propogated into the underlying customer object retrieved from the database*/
        var customer = Mapper.Map<CustomerDto,Customer>(customerToUpdate);
        repository.Save(customer);
    }

public class CustomerDto
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public List<CategoryDto> Categories { get; set; }
    }

    public class CategoryDto
    {
        public int Id { get; set; }
        public string CategoryName { get; set; }
    }

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <class name="Customer" table="Customer">
        <id name="Id" column="CustomerId">
          <generator class="native"/>
        </id>
        <property name="Code" />
        <property name="Description" />
        <bag name="Categories" table="Categories" cascade="all" inverse="false">
          <key column="FK_CustomerID" />
          <one-to-many class="Category"/>
        </bag>
      </class>

      <class name="Category" table="Categories">
        <id name="Id" column="CategoryId">
          <generator class="native"/>
        </id>
        <many-to-one name="Customer" column="FK_CustomerId" not-null="true" class="Customer"></many-to-one>
        <property name="CategoryName" />
      </class>
    </hibernate-mapping>

questionAnswers(4)

yourAnswerToTheQuestion