2011-02-08 61 views
11

我有这样的事情如何自动映射这个(映射子成员)

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); 

,因为它无法弄清楚如何把产品编号中,因为它 是

Store.Product.ProductId; 

我的地图是这样不会绑定什么这

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

我得到这个错误

表达式'dest => 转换(dest.Product.SelectedProductId'必须 解析为顶级成员。参数 name:lambda表达式

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

+0

你能修复你的代码吗?那里有很多错误。例如,'public class MyTest()'不是一个有效的类声明,'public MyTest(){get; set;}'不是有效的属性声明。 –

+0

您是否有意将您的视图模型映射回您的域类?这不是automappers人员推荐的。 –

+2

@Brian - Ya。为什么不?我的意思是我认为这是自动映射器的重点。否则,我必须手工制作所有的东西,否则就会破坏自动制图仪的目的。那么我也可以只是手动地图域来查看模型。 – chobo2

回答

1

你得到的错误是因为你不能在对象图中声明超过一个深度的映射声明。

因为你只发布了一个属性,所以我很难给你提供这个工作的代码。一种选择是将您的viewmodel属性更改为MyTestTestId,并且约定会自动选择。

+0

我增加了一些属性。 – chobo2

+0

还有一件事,我改变了我的东西,试图让它按照惯例接受,但它不起作用。我将SelectedProductId更改为ProductId和ProductId(在我的域中)为Id。仍然不绑定。 – chobo2

+0

duyker的答案 –

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; } 
} 
2

您CA n使用解析器。

创建一个解析器类这样的:

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 >()); 

希望这将有助于...

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移开它已经过时,很快就不会被支持。