2012-02-03 3 views
2

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

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

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

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

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

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(); 
} 
+0

AutoMapper map вложенные свойства. Это означает, что вам не нужно отдельно отображать адрес. Просто создайте карту для нее, прежде чем сопоставлять «клиент», и она будет отображаться автоматически. – Maxim

+0

Как создать вложенную карту? – Scottie

+0

AutoMapper поддерживает его из коробки, просто «CreateMap» для всех вложенных типов перед сопоставлением. – Maxim