如何自动化(映射子成员)

时间:2011-02-08 00:51:19

标签: c# asp.net-mvc automapper

我有类似的东西

public class ProductViewModel
{
  public int SelectedProductId { get; set; }
  public string ProductName {get; set;}
  public int Qty {get; set;}
   public List<SelectListItem> Products { get; set}; 
}

我有这样的域名

public class Product
{
  public int ProductId {get; set;}
  public string ProductName {get; set;}
  public int Qty {get; set;}
}


public class Store
{
  public Product() {get; set;}
}

现在我需要进行映射。

//在我的控制器中

var result = Mapper.Map<ProductViewModel, Store>(Product);

这不会绑定任何东西,因为它无法弄清楚如何将ProductId放入其中 是

Store.Product.ProductId;

我的地图就像这样

Mapper.CreateMap<ProductViewModel, Store>().ForMember(dest => dest.Product.ProductId, opt => opt.MapFrom(src => src.SelectedProductId));

我收到此错误

  

表达式'dest =&gt;   转换(dest.Product.SelectedProductId'必须   解析为顶级会员。参数   name:lambdaExpression

我不确定如何做到这一点。

4 个答案:

答案 0 :(得分:25)

要映射嵌套结构,只需在 MapFrom 参数中创建一个新对象。

示例

映射:

Mapper.CreateMap<Source, Destination>()
      .ForMember(d => d.MyNestedType, o => o.MapFrom(t => new NestedType { Id = t.Id }));
Mapper.AssertConfigurationIsValid();

测试代码:

var source = new Source { Id = 5 };
var destination = Mapper.Map<Source, Destination>(source);

类:

public class Source
{
    public int Id { get; set; }
}

public class Destination
{
    public NestedType MyNestedType { get; set; }
}

public class NestedType
{
    public int Id { get; set; }
}

答案 1 :(得分:2)

您可以使用解析器。

创建一个类似的解析器类:

class StoreResolver : ValueResolver<Store, int>
{
    protected override int ResolveCore(Store store)
    {
        return store.Product.ProductId;
    }
}

并使用它:

Mapper.CreateMap<ProductViewModel, Store>()
        .ForMember(dest => dest.SelectedProductId, opt => opt.ResolveUsing<StoreResolver >());

希望它会有所帮助...

答案 2 :(得分:1)

您得到的错误是因为您无法在对象图中深度声明多个级别的映射声明。

因为您只发布了一个属性,我很难为您提供使这项工作的代码。一种选择是将viewmodel属性更改为MyTestTestId,约定将自动获取。

答案 3 :(得分:0)

allrameest对此问题给出的正确答案应该有所帮助:AutoMapper - Deep level mapping

这就是你需要的:

Mapper.CreateMap<ProductViewModel, Store>()
    .ForMember(dest => dest.Product, opt => opt.MapFrom(src => src));
Mapper.CreateMap<ProductviewModel, Product>()
    .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.SelectedProductId));

注意:此时你应该尝试不再使用Mapper.CreateMap,它已经过时,很快就会得不到支持。