如何更新从视图模型使用Automapper和EF4的DbContext与延迟加载启用一个现有实体 [英] How to update an existing Entity from ViewModel using Automapper and EF4 DbContext with Lazy Loading enabled

查看:542
本文介绍了如何更新从视图模型使用Automapper和EF4的DbContext与延迟加载启用一个现有实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆