При использовании DTO Automapper и Nhibernate отражают изменения в дочерних коллекциях DTO в обновляемом объекте домена.

Я не очень знаком с этим дизайном, но надеюсь получить руководство.

У меня есть бэкэнд-сервис, который отправляет DTO на смарт-клиент WPF. На интеллектуальном клиенте WPF пользователь будет изменять, удалять и изменять элементы, а затем изменения отправляются обратно (клиент -> сервер). Например, в настоящее время я работаю над формой сведений о клиенте, и у пользователя есть возможность добавлять, удалять и изменять категории, принадлежащие клиенту, в сетке данных. Когда DTO отправляется обратно на сервер, я хотел бы загрузить объект домена, связанный с идентификатором в DTO, и применить изменения, внесенные в DTO, к объекту домена, включая все дочерние коллекции.

Я сделал попытку сделать что-то подобное в приведенном ниже коде сUpdateCustomer метод. Тем не менее, я думаю, что я далеко от цели. Когда код выполняется вместо того, чтобы заканчиваться списком{Individual, Company, НПО, правительство} Я заканчиваю со списком{Individual, B2B, компания, НПО, правительство} поскольку он явно не удалил запись B2B из исходного списка.

Один вариант, который мне пришёл в голову, - это циклически просматривать коллекцию DTO и сравнивать ее с коллекцией из объекта домена, а также добавлять, удалять и обновлять в зависимости от того, что было изменено. Тем не менее, это казалось действительно громоздким.

Что мне нужно сделать, чтобы применить изменения из DTO к дочерним коллекциям в моем объекте domiain?

Большое спасибо за любую помощь, она будет высоко оценена

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>

Ответы на вопрос(2)

Ваш ответ на вопрос