gpt4 book ai didi

c# - 无法使用 Automapper 将第二个实体添加到 ViewModel?

转载 作者:行者123 更新时间:2023-11-30 21:52:23 27 4
gpt4 key购买 nike

我仍在学习 MVC,最近有人建议我考虑使用 AutoMapper 来映射我的 ViewModel。因此,我开始了测试,但我不了解如何映射两个实体,也找不到示例。

我有一个 Person 表和一个 Address 表。我想将两者组合成一个 ViewModel 以传递给我的 View。查看示例,它们总是显示如何映射一个实体而不是两个实体。

在下面的代码中,我可以看到我的 currentPerson 和 currentAddress 对象都使用调试器填充了数据,但是我的 currentMember ViewModel 只有 Person 数据。这是有道理的,因为我只在 Person 上使用 Mapper.Map,但我如何告诉 currentMember 也映射地址?

public ActionResult Edit(int id = 0)
{
using (DataContext db = new DataContext())
{
Person currentPerson = db.Person.Find(id);
Address currentAddress = db.Address.Single(a => a.PID == id);

AutoMapper.Mapper.CreateMap<Person, AdminViewModel>();
AutoMapper.Mapper.CreateMap<Address, AdminViewModel>();

MemberViewModel currentMember = AutoMapper.Mapper.Map<AdminViewModel>(currentPerson);

return View(currentMember);
}
}

最佳答案

AutoMapper.Map 有一个带有源对象和目标对象的重载。所以你可以使用这样的东西来利用它:

创建 View 模型

public class PersonViewModel
{
//your person fields here..
//create them with the same name as Person
//to avoid having to set each field during mapping
}

public class AddressViewModel
{
//your address fields here..
}

public class AdminViewModel
{
public PersonViewModel Person {get; set;}

public AddressViewModel Address {get; set;}
}

Crete 映射(您应该将所有映射集中在一个类中):

public class EntityToViewModelProfile : Profile
{
protected override void Configure()
{
//Create mappings for Person and Address
AutoMapper.Mapper.CreateMap<Person, AdminViewModel>();
AutoMapper.Mapper.CreateMap<Address, AdminViewModel>();


//Create a map to AdminViewModel for both Person and Address

Mapper.CreateMap<Models.Person, Models.AdminViewModel>()
.ForMember(dest => dest.Person, opt => opt.MapFrom(src => src));

Mapper.CreateMap<Models.Address, Models.AdminViewModel>()
.ForMember(dest => dest.Address, opt => opt.MapFrom(src => src));
}
}

Global.asax.cs 中注册 EntityToViewModelProfile

AutoMapper.Mapper.Initialize(x =>
{
x.AddProfile<EntityToViewModelProfile>();
});

然后,在您的 Controller 中使用 .Map 的重载

using (DataContext db = new DataContext())
{
Person currentPerson = db.Person.Find(id);
Address currentAddress = db.Address.Single(a => a.PID == id);

var mapPerson = AutoMapper.Mapper.Map<Person, AdminViewModel>(currentPerson);

var mapPersonAndAddress = AutoMapper.Mapper.Map<Address, AdminViewModel>(currentAddress, mapPerson);

return View(mapPersonAndAddress);
}

关于c# - 无法使用 Automapper 将第二个实体添加到 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34804073/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com