C# 自动映射并在创建时将一个映射到多个
因此,我的数据库在客户和订单之间有一对多的关联。C# 自动映射并在创建时将一个映射到多个,c#,automapper,C#,Automapper,因此,我的数据库在客户和订单之间有一对多的关联。 映射数据以显示客户及其订单没有问题。但是,在创建客户时,有没有一种方法可以映射这些信息 例如: “用于测试映射的非常基本的viewModel” 因此,create视图只有两个输入,分别是Name和Date。 “用于测试映射的非常基本的控制器;)” [HttpPost] 公共行动结果创建(CVM模型) { CreateMap(); Customer=Mapper.Map(模型); 返回视图(); } 因此ContactName被正确映射。问题
映射数据以显示客户及其订单没有问题。但是,在创建客户时,有没有一种方法可以映射这些信息 例如: “用于测试映射的非常基本的viewModel” 因此,create视图只有两个输入,分别是Name和Date。 “用于测试映射的非常基本的控制器;)”
[HttpPost]
公共行动结果创建(CVM模型)
{
CreateMap();
Customer=Mapper.Map(模型);
返回视图();
}
因此ContactName被正确映射。问题在于订单日期。AutoMapper必须创建一个Order实例,设置OrderDate的值并将其传递给Customer对象的OrdersCollection。是AutoMapper能够做到这一点,还是我完全错了
希望你能理解我的解释,有人能回答我
谢谢大家我认为你们走错了方向。您应该做的是实例化一个
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();
}
[HttpPost]
公共行动结果创建(CVM模型)
{
CreateMap();
Customer=/*构造或获取客户实例,例如从数据库*/
Mapper.Map(模型、客户);
返回视图();
}
顺便说一句,您应该确保只有在应用程序启动时才有Mapper.CreateMap()
指令,否则您将不必要地对每个请求执行此步骤(可能代价高昂)
编辑
看来我把原来的问题看错了。如果目标是创建具有关联对象的客户,那么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; }
}
公众人物{
公共字符串名称{get;set;}
公共字符串列表编号{get;set;}
}
公众人物{
公共字符串名称{get;set;}
公共字符串IList编号{get;set;}
}
公用电话号码{
公共int类型{get;set;}
公共字符串编号{get;set;}
}
公用电话号码{
公共int类型{get;set;}
公共字符串编号{get;set;}
}
那么你有几个选择:
PhoneNumberVM
实例映射到PhoneNumber
实例,或者Mapper.CreateMap()
,只需调用Mapper.Map(model)
即可将模型映射到实体当然,您必须确保正确构造模型,但只要您使用相同的模型生成HTML表单,这并不困难。我认为您的做法是错误的。您应该做的是实例化一个
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();
}
[HttpPost]
公共行动结果创建(CVM模型)
{
CreateMap();
Customer=/*构造或获取客户实例,例如从数据库*/
Mapper.Map(模型、客户);
返回视图();
}
顺便说一句,您应该确保只有在应用程序启动时才有Mapper.CreateMap()
指令,否则您将不必要地对每个请求执行此步骤(可能代价高昂)
编辑
看来我把原来的问题看错了。如果目标是创建具有关联对象的客户,那么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; }
}
公众人物{
公共字符串名称{get;set;}
公共字符串列表编号{get;set;}
}
公众人物{
公共字符串名称{get;set;}
公共字符串IList编号{get;set;}
}
公用电话号码{
公共int类型{get;set;}
公共字符串编号{get;set;}
}
公用电话号码{
公共int类型{get;set;}
公共字符串编号{get;set;}
}
那么你有几个选择:
PhoneNumberVM
实例映射到PhoneNumber
实例,或者Mapper.CreateMap()
,只需调用Mapper.Map(model)
即可将模型映射到实体当然,您必须确保正确构建模型,但只要使用相同的模型生成HTML表单,这并不困难。谢谢,但我认为这对我没有帮助。我想做的是同时创建一个客户和一个订单。想象一个有名字和各种电话号码(由person实体中的列表表示)的人。我想创建一个createView,其中包含一个name字段,比如3个不同电话号码的字段(private、business、mobile)。AutoMapper现在应该将号码映射到电话号码实体,并将其添加到个人实体的电话号码列表中。我希望我说得清楚,而不是更难^^^我明白了,我想我没有完全理解所问的问题。我也曾做过类似的事情。我认为诀窍是在ViewModel上正确命名属性。因此,您的
CVM
必须有一个属性IList PhoneNumber
,然后AutoMapper将能够很好地映射这些属性。您还可以为PhoneNumber
对象(如PhoneNumberVM
)创建一个视图模型,并使用该模型进行映射。我不太明白。CustomerServiceWModel中的IList属性对我没有帮助。无法为此属性设置值。电话号码viewmodel应该如何帮助我?对我来说,AutoMapper似乎无法处理这个问题。M