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