Cuando se usan DTO, Automapper y Nhibernate que reflejan cambios en colecciones secundarias de DTO en objeto de dominio que se actualiza

No estoy muy familiarizado con este diseño, pero espero obtener alguna orientación.

Tengo un servicio de back-end que envía DTO a un cliente inteligente WPF. En el cliente inteligente WPF, el usuario cambiará, eliminará y modificará elementos y luego los cambios se enviarán de regreso (cliente -> servidor). Como ejemplo, actualmente estoy trabajando en el formulario Detalles del cliente y el usuario tiene la capacidad de agregar, eliminar y cambiar categorías que pertenecen a un cliente en una cuadrícula de datos. Cuando el DTO se devuelve al servidor, me gustaría cargar el objeto de dominio relacionado con la ID en el DTO y aplicar los cambios realizados en el DTO al objeto de dominio, incluidas todas las colecciones secundarias.

He intentado hacer algo similar a esto en el siguiente código con la UpdateCustomer método. Sin embargo, creo que estoy fuera de lugar. Cuando se ejecuta el código en lugar de terminar con una lista de {Individuo, Empresa, ONG, Gobierno} Termino con una lista de {Individual, B2B, Empresa, ONG, Gobierno} ya que claramente no ha eliminado la entrada B2B de la lista original.

Una opción que se me ha ocurrido es recorrer la colección DTO y compararla con la colección del objeto de dominio y agregar, eliminar y actualizar dependiendo de lo que se haya modificado. Sin embargo, esto parecía realmente engorroso.

¿Qué debo hacer para aplicar los cambios del DTO a las colecciones secundarias en mi objeto domiain?

Muchas gracias por cualquier ayuda, será muy apreciada

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>

Respuestas a la pregunta(4)

Su respuesta a la pregunta