如何更新从视图模型使用Automapper和EF4的DbContext与延迟加载启用一个现有实体 [英] How to update an existing Entity from ViewModel using Automapper and EF4 DbContext with Lazy Loading enabled
问题描述
我使用Automapper到实体和视图模型对象(双向)之间进行映射。该模型使用EF4的DbContext波苏斯,需要惰性加载(因此代理代)启用。
我所遇到试图更新从视图模型现有实体的一个问题。当我打电话Mapper.Map(VM,实体),Automapper抛出异常。我的问题是:怎么是你应该使用Automapper EF代理对象的工作。
在code相(简体)是这样的:
公共类myEntity所
{
公众诠释标识{获取;设置;}
公众诠释名称{;设置;}
}公共类视图模型
{
公众诠释标识{获取;设置;}
公众诠释名称{;设置;}
}Mapper.CreateMap< myEntity所,视图模型>();
Mapper.CreateMap<视图模型,myEntity所>();公众的ActionResult编辑(视图模型VM)
{
myEntity所实体= db.MyEntities.Find(vm.Id);
Mapper.Map(VM,实体);
db.Entry(实体).STATE = EntityState.Modified;
db.SaveChanges();
}
当我打电话Mapper.Map(VM,实体)更新现有的实体对象,我得到异常:
'Mapper.Map(视图模型,的resultSet)'扔类型的异常AutoMapper.AutoMapperMappingException
基地的System.Exception {}:{缺少类型映射配置或不支持的映射\\ n \\ nMapping类型:\\ r \\ nResultSetView - 方式> ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\\r\
Sciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView - > System.Data.Entity.DynamicProxies.ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\
\
Destination路径:\\ nResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2 \\ n \\ n源值:\\ nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView}
语境:{试图ResultSetView映射到ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2。}
。消息:缺少类型映射配置或不支持的映射\\ n \\ nMapping类型:\\ r \\ nResultSetView - > ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\\r\
Sciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView - > System.Data.Entity.DynamicProxies.ResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2\
\
Destination路径:\\ nResultSet_692D75838D4DC59B922F3E88CF1B10516CBF6CD8A32C4BE2F3FCC28CE83F0BD2 \\ n \\ n源值:\\ nSciensus.Applications.ClinicalStudies.Web.Areas.Patient.Models.ResultSetView
堆栈跟踪:
我看了看AutoMapper源$ C $ C:
公共TDestination地图< TSource,TDestination>(TSource源,TDestination目的地)
{
返回地图(源,目标,选择采用= GT; {});
} 公共TDestination地图< TSource,TDestination>(TSource源,TDestination目的地,动作< IMappingOperationOptions>选择采用)
{
键入modelType = typeof运算(TSource);
类型destinationType =(等号(目的地,默认(TDestination))的typeof(TDestination):destination.GetType()); 回报(TDestination)地图(源,目标,modelType,destinationType,选择采用);
}
问题发生在这个地方:
键入destinationType =(等号(目的地,默认(TDestination))的typeof(TDestination):destination.GetType());
,这样才不会有问题的变化:
Mapper.Map(VM,实体的typeof(视图模型)的typeof(myEntity所));
I am using Automapper to map between Entity and ViewModel object (in both directions). The model uses EF4 DbContext POCOs and needs LazyLoading (and therefore Proxy Generation) enabled.
I have come across a problem attempting to update an existing entity from a viewmodel. When I call Mapper.Map(vm, entity), Automapper throws an exception. My question is: how are you supposed to work with EF Proxy objects using Automapper?
The code looks (simplified) like this:
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();
}
When I call Mapper.Map(vm, entity) to update the existing entity object, I get the exception:
'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: ""
I looked at the AutoMapper source Code:
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);
}
Problems occurred in this place:
Type destinationType = (Equals(destination, default(TDestination)) ? typeof(TDestination) : destination.GetType());
So the change that do not have a problem:
Mapper.Map(vm, entity,typeof(ViewModel),typeof(MyEntity));
这篇关于如何更新从视图模型使用Automapper和EF4的DbContext与延迟加载启用一个现有实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!