所以我的DB在客户和订单之间有一对多的关联 映射数据以显示客户及其订单是没有问题的。但有没有办法在创建客户时映射这些?
例如: “非常基本的viewModel只是为了测试Mapping”
public class CVM
{
public string ContactName { get; set; } //Part of the Customer Table
public DateTime OrderDate { get; set; } //Part of the Orders Table and
//would have to be passed into the Orders List of the EF-Customer-Object
}
因此,创建视图只有2个名称和日期输入。 “非常基本的控制器只是为了测试Mapping;)”
[HttpPost]
public ActionResult Create(CVM model)
{
Mapper.CreateMap<CVM, Customer>();
Customer customer = Mapper.Map<CVM, Customer>(model);
return View();
}
所以ContactName被正确映射。问题是OrderDate。 AutoMapper必须创建一个Order实例,设置OrderDate的值并将其传递给Customer对象的OrdersCollection。 AutoMapper能够做到这一点还是完全错了?
希望您理解我的解释,并且有人对我有答案。
谢谢民众
答案 0 :(得分:1)
我认为你的做法是错误的。您应该做的是实例化Customer
实例,然后使用AutoMapper将其映射到属性。
因此,您的代码看起来像:
[HttpPost]
public ActionResult Create(CVM model)
{
Mapper.CreateMap<CVM, Customer>();
Customer customer = /* Construct or get a Customer instance, eg from DB. */
Mapper.Map<CVM, Customer>(model, customer);
return View();
}
顺便说一句,你应该确保只在应用程序启动期间有Mapper.CreateMap<CVM, Customer>()
指令,否则你每次请求都不必要地执行这个(可能是代价高昂的)步骤。
我似乎错误地读了原来的问题。如果目标是创建一个具有关联对象的Customer,那么Automapper可以通过几种不同的方式为您提供帮助(我将继续您在评论中提供的Person / PhoneNumber示例)。
鉴于您的实体和视图模型是:
public Person {
public string Name { get; set; }
public string List<PhoneNumber> Numbers { get; set; }
}
public PersonVM {
public string Name { get; set; }
public string IList<PhoneNumberVM> Numbers { get; set; }
}
public PhoneNumber {
public int Type { get; set; }
public string Number { get; set; }
}
public PhoneNumberVM {
public int Type { get; set; }
public string Number { get; set; }
}
然后你有几个选择:
PhoneNumberVM
实例映射到PhoneNumber
实例,或Mapper.CreateMap<PhoneNumberVM, PhoneNumber>()
,只需致电Mapper.Map<PersonVM, Person>(model)
即可将您的模型映射到您的实体。当然,您必须确保模型构建正确,但只要您使用相同的模型生成HTML表单,这就不是很难。