我在我的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());
工作正常,但我失去了我的應用自定義映射能力。
我錯過了什麼嗎?感謝您的幫助!
謝謝!巴拉
作爲一個側面說明了'Mapper.CreateMap'靜態方法應該叫每個AppDomain只有一次,最好是在的Application_Start,而不是每次你映射。 –
感謝提示Darin,是的,我將所有的CreateMap代碼存儲在靜態類的靜態方法中,並在Application_Start中調用靜態方法。希望這是最好的做法。 – Balaram