AutoMapper并在Create上映射一对多

时间:2011-03-30 11:11:20

标签: c# automapper

所以我的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能够做到这一点还是完全错了?

希望您理解我的解释,并且有人对我有答案。

谢谢民众

1 个答案:

答案 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; }
}

然后你有几个选择:

  1. 您可以尝试编写自定义映射规则,以便将每个PhoneNumberVM实例映射到PhoneNumber实例,或
  2. 您可以添加Mapper.CreateMap<PhoneNumberVM, PhoneNumber>(),只需致电Mapper.Map<PersonVM, Person>(model)即可将您的模型映射到您的实体。
  3. 当然,您必须确保模型构建正确,但只要您使用相同的模型生成HTML表单,这就不是很难。