Asp.net mvc 3 我用automapper加载了我的数据库。现在,我如何将数据返回到viewModel中?

Asp.net mvc 3 我用automapper加载了我的数据库。现在,我如何将数据返回到viewModel中?,asp.net-mvc-3,automapper,Asp.net Mvc 3,Automapper,所以我有一个7个ViewModels,它引用了3个域模型,我使用automapper将模型映射到ViewModels,效果很好,现在我想从数据库中存储的数据填充ViewModel,我遇到了很多问题 这是我的Automapper.Configure() 受保护的覆盖无效配置() { //在节省时间时动态配置。 CreateMap(); CreateMap(); CreateMap(); CreateMap(); CreateMap(); CreateMap(); CreateMap(); } 我

所以我有一个7个ViewModels,它引用了3个域模型,我使用automapper将模型映射到ViewModels,效果很好,现在我想从数据库中存储的数据填充ViewModel,我遇到了很多问题

这是我的Automapper.Configure()

受保护的覆盖无效配置()
{
//在节省时间时动态配置。
CreateMap();
CreateMap();
CreateMap();
CreateMap();
CreateMap();
CreateMap();
CreateMap();
}

我如何告诉应用程序,“当我从DBContext加载时,自动将实体移动到ViewModel中”,似乎使用Automapper可以从ViewModel加载实体,但不能从相反方向加载实体。

Automapper不会自动定义双向映射。如果要从视图模型映射到相应的域模型,还应定义此映射:

CreateMap<Step0ViewModel, Preparer>();
CreateMap<Preparer, Step0ViewModel>();
CreateMap();
CreateMap();

AutoMapper不会自动定义双向映射。如果要从视图模型映射到相应的域模型,还应定义此映射:

CreateMap<Step0ViewModel, Preparer>();
CreateMap<Preparer, Step0ViewModel>();
CreateMap();
CreateMap();

Automapper可以做相反的操作,您只需为其创建地图:

protected override void Configure()
{
    //Configure dynamically at save time.
    CreateMap<Preparer, Step0ViewModel>();
    ...
}
受保护的覆盖无效配置()
{
//在节省时间时动态配置。
CreateMap();
...
}
至于在加载时自动加载映射,我不知道这项功能,但它可以通过映射助手轻松设置到linq查询:

public static class AutoMapperExtensions
{
    public static TResult MapTo<TResult>(this object self)
    {
        if (self == null)
            throw new ArgumentNullException();

        return (TResult)Mapper.Map(self, self.GetType(), typeof(TResult));
    }
}
公共静态类扩展
{
公共静态TResult映射到(此对象本身)
{
if(self==null)
抛出新ArgumentNullException();
return(TResult)Mapper.Map(self,self.GetType(),typeof(TResult));
}
}
然后在您的查询中:

var viewModel = _myContext.Preparers.Find(1).MapTo<Step0ViewModel>();
var viewModel=\u myContext.Preparers.Find(1.MapTo();

Automapper可以做相反的操作,您只需为其创建地图:

protected override void Configure()
{
    //Configure dynamically at save time.
    CreateMap<Preparer, Step0ViewModel>();
    ...
}
受保护的覆盖无效配置()
{
//在节省时间时动态配置。
CreateMap();
...
}
至于在加载时自动加载映射,我不知道这项功能,但它可以通过映射助手轻松设置到linq查询:

public static class AutoMapperExtensions
{
    public static TResult MapTo<TResult>(this object self)
    {
        if (self == null)
            throw new ArgumentNullException();

        return (TResult)Mapper.Map(self, self.GetType(), typeof(TResult));
    }
}
公共静态类扩展
{
公共静态TResult映射到(此对象本身)
{
if(self==null)
抛出新ArgumentNullException();
return(TResult)Mapper.Map(self,self.GetType(),typeof(TResult));
}
}
然后在您的查询中:

var viewModel = _myContext.Preparers.Find(1).MapTo<Step0ViewModel>();
var viewModel=\u myContext.Preparers.Find(1.MapTo();

这样做对吗?Jim Bogard似乎有一篇文章谴责这一点,但我可能不理解这篇文章。@Doug,他确实谴责了这一点,但这实际上只是一种哲学观点,他没有明确禁止双向映射,因为有些人可以并且会很好地使用它。@Doug我相信AutoMapper 2中的Jim Bogard已经出现,并且正在更多地考虑扩展双向映射-更好地支持取消平台。至少这是我从各处的各种评论中收集到的——不幸的是,现在找不到来源。不过,关于这可能是什么时候的消息并不多。目前,您可以使用CreateMap().formMember(d=>d.Prop1,o=>o.MapFrom(…)进行膨胀。这样做正确吗?Jim Bogard似乎有一篇文章谴责这一点,但我可能不理解这篇文章。@Doug,他确实谴责了这一点,但这实际上只是一种哲学观点,他没有明确禁止双向映射,因为有些人可以并且会很好地使用它。@Doug我相信AutoMapper 2中的Jim Bogard已经出现,并且正在更多地考虑扩展双向映射-更好地支持取消平台。至少这是我从各处的各种评论中收集到的——不幸的是,现在找不到来源。不过,关于这可能是什么时候的消息并不多。目前,您可以使用CreateMap().formMember(d=>d.Prop1,o=>o.MapFrom(…)进行膨胀。谢谢!如果你愿意的话,我粘贴了整个扩展类:在映射到现有对象的过程中有点奇怪(因为它们是引用类型,传递的参数也会被修改)。谢谢!如果您愿意,我粘贴了整个扩展类:到现有对象的映射有点奇怪(因为它们是引用类型,所以传递的参数也会被修改)。