Почему автомаппер делает вставку Entity Framework вместо обновления? - PullRequest
3 голосов
/ 04 февраля 2012

У меня есть таблица клиентов с внешней ссылкой на таблицу адресов.Похоже, что AutoMapper делает что-то, чтобы EF подумал, что моя ссылка на адрес - это новая запись, а не обновляет существующую запись.

Этот код корректно обновляет запись адреса.Он не добавляет новый:

using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
{
    CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);

    DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);

    updateCustomer.ResellerID = customer.ResellerID;
    updateCustomer.CustomerType = customer.CustomerType;
    updateCustomer.Password = customer.Password;
    updateCustomer.Comments = customer.Comments;

    updateCustomer.Address.ResellerID = customer.Address.ResellerID;
    updateCustomer.Address.AddressCode = customer.Address.AddressCode;
    updateCustomer.Address.AddressType = customer.Address.AddressType;
    updateCustomer.Address.CompanyName = customer.Address.CompanyName;
    updateCustomer.Address.LastName = customer.Address.LastName;
    updateCustomer.Address.FirstName = customer.Address.FirstName;

    uow.SaveChanges();
}

Этот код всегда добавляет новую запись адреса:

using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
{
    CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);

    DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);

    Mapper.CreateMap<Customer, Customer>()
        .ForMember(dest => dest.CustomerID, opt => opt.Ignore());
    Mapper.Map(customer, updateCustomer);

    Mapper.CreateMap<Address, Address>()
        .ForMember(dest => dest.ID, opt => opt.Ignore());
    Mapper.Map(customer.Address, updateCustomer.Address);

    uow.SaveChanges();
}

Есть идеи, почему это происходит?

1 Ответ

1 голос
/ 04 февраля 2012

Я только что понял.

AutoMapper отображает ВСЕ поля в Customer, включая поле Address.Следующий код прекрасно работает:

using (CSIntUnitOfWork uow = new CSIntUnitOfWork())
{
    CustomerRepository customerRepository = new CustomerRepository(uow, _resellerID);

    DataModels.Customer updateCustomer = customerRepository.GetByID(customer.CustomerID);

    Mapper.CreateMap<Customer, Customer>()
        .ForMember(dest => dest.CustomerID, opt => opt.Ignore())
        .ForMember(dest => dest.Address, opt => opt.Ignore());  // <-- This was the problem!
    Mapper.Map(customer, updateCustomer);

    Mapper.CreateMap<Address, Address>()
        .ForMember(dest => dest.ID, opt => opt.Ignore());
    Mapper.Map(customer.Address, updateCustomer.Address);

    uow.SaveChanges();
}
...