2012-02-03 5 views
2

Addressesテーブルへの外部参照を持つCustomersテーブルがあります。 AutoMapperは、既存のレコードを更新するのではなく、自分のAddress参照が新しいレコードであると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マップのネストされたプロパティ。あなたはアドレスを別々にマップする必要はないという意味です。 「顧客」をマッピングする前にマップを作成すれば、自動的にマップされます。 – Maxim

+0

ネストマップを作成するにはどうすればよいですか? – Scottie

+0

AutoMapperは、それをそのままの状態でサポートします。マッピング前のすべてのネストされた型の "CreateMap"だけです。 – Maxim

関連する問題