2011-11-21 41 views
3

我在我的MVC/EF Code First項目中使用Automapper。將ViewModel映射到View時,我使用從TypeConverter繼承的客戶轉換器類。我使用以下代碼設置映射:使用Automapper/EF進行數據庫更新CodeFirst

Mapper.CreateMap<CustomerViewModel, Customer>().ConvertUsing<CustomerConverter>(); 

其中CustomerConverter是我的TypeConverter類。

,同時創造了新的客戶實體,並保存到數據庫

Customer customer = Mapper.Map<CustomerViewModel, Customer>(viewModel); 
dbEntities.Customer.Add(customer); 
dbEntities.SaveChanges(); 

但是當編輯現有的客戶也能正常工作,我發現改變客戶對象都沒有得到保存。

我用它來處理現有客戶更新的代碼如下

var customer = dbEntities.Customer.Single(a => a.CustomerId == viewModel.CustomerId.Value); 
Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()).ConvertUsing<ExistingCustomerConverter>(); 
Mapper.Map<ExistingCustomerViewModel, Customer>(viewModel, customer); 
dbEntities.Entry(customer).State = EntityState.Modified; 
dbEntities.SaveChanges(); 

我使用不同的視圖模型和客戶的轉換器來處理現有的客戶,因爲我更新現有客戶僅顯示有限的領域。

問題是,用上面的代碼,客戶記錄沒有更新。 我發現,如果我刪除自定義轉換,客戶記錄更新。

Mapper.CreateMap<ExistingCustomerViewModel, Customer>().ForMember(dest => dest.CustomerId, opt => opt.Ignore()); 

工作正常,但我失去了我的應用自定義映射能力。

我錯過了什麼嗎?感謝您的幫助!

謝謝!巴拉

+2

作爲一個側面說明了'Mapper.CreateMap'靜態方法應該叫每個AppDomain只有一次,最好是在的Application_Start,而不是每次你映射。 –

+0

感謝提示Darin,是的,我將所有的CreateMap代碼存儲在靜態類的靜態方法中,並在Application_Start中調用靜態方法。希望這是最好的做法。 – Balaram

回答

相關問題