Asp.net-Mvc
如何在啟用延遲載入的情況下使用 Automapper 和 EF4 DbContext 從 ViewModel 更新現有實體
我正在使用 Automapper 在 Entity 和 ViewModel 對象之間進行映射(雙向)。該模型使用 EF4 DbContext POCO,需要啟用 LazyLoading(因此需要代理生成)。
我在嘗試從視圖模型更新現有實體時遇到了問題。當我呼叫 Mapper.Map(vm, entity) 時,Automapper 會引發異常。我的問題是:您應該如何使用 Automapper 處理 EF 代理對象?
程式碼看起來(簡化)如下:
public class MyEntity { public int Id {get;set;} public int Name {get;set;} } public class ViewModel { public int Id {get;set;} public int Name {get;set;} } Mapper.CreateMap<MyEntity, ViewModel>(); Mapper.CreateMap<ViewModel, MyEntity>(); public ActionResult Edit(ViewModel vm) { MyEntity entity = db.MyEntities.Find(vm.Id); Mapper.Map(vm, entity); db.Entry(entity).State = EntityState.Modified; db.SaveChanges(); }當我呼叫 Mapper.Map(vm, entity) 來更新現有的實體對象時,我得到了異常:
'Mapper.Map(viewModel, resultSet)' threw an exception of type 'AutoMapper.AutoMapperMappingException' base {System.Exception}: {"Missing type map configuration or unsupported mapping.\n\nMapping types:\r\nResultSetView -> ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\r\nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView -> System.Data.Entity.DynamicProxies.ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\n\nDestination path:\nResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\n\nSource value:\nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView"} Context: {Trying to map ResultSetView to ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2.} Message: "Missing type map configuration or unsupported mapping.\n\nMapping types:\r\nResultSetView -> ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\r\nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView -> System.Data.Entity.DynamicProxies.ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\n\nDestination path:\nResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\n\nSource value:\nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView" StackTrace: ""
我查看了 AutoMapper 原始碼:
public TDestination Map<TSource, TDestination>(TSource source, TDestination destination) { return Map(source, destination, opts => { }); } public TDestination Map<TSource, TDestination>(TSource source, TDestination destination, Action<IMappingOperationOptions> opts) { Type modelType = typeof(TSource); Type destinationType = (Equals(destination, default(TDestination)) ? typeof(TDestination) : destination.GetType()); return (TDestination)Map(source, destination, modelType, destinationType, opts); }這個地方出現了問題:
Type destinationType = (Equals(destination, default(TDestination)) ? typeof(TDestination) : destination.GetType());所以沒有問題的變化:
Mapper.Map(vm, entity,typeof(ViewModel),typeof(MyEntity));