Asp.net-Mvc

如何在啟用延遲載入的情況下使用 Automapper 和 EF4 DbContext 從 ViewModel 更新現有實體

  • January 11, 2013

我正在使用 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));

引用自:https://stackoverflow.com/questions/13416816