2011-02-08 20 views
11

Automap कैसे मैं इसइस (मानचित्रण उप सदस्य)

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; 

मेरे मानचित्र की तरह है productId डाल करने के लिए इस

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

मैं इस त्रुटि मिलती है

अभिव्यक्ति 'dest => कनवर्ट करें (dest.Product.SelectedProductId' शीर्ष-स्तरीय सदस्य को हल करना चाहिए। पैरामीटर नाम: lambdaExpression

मुझे यह सुनिश्चित नहीं है कि यह कैसे करें।

+0

क्या आप अपना कोड ठीक कर सकते हैं? आपको वहां बहुत सारी त्रुटियां हैं। उदाहरण के लिए, 'पब्लिक क्लास माईटेस्ट() 'वैध वर्ग घोषणा नहीं है, और' सार्वजनिक MyTest() {get; सेट;} 'वैध संपत्ति घोषणा नहीं है। –

+0

क्या आप जानबूझकर अपने व्यू मॉडल से अपने डोमेन क्लास में मानचित्रण कर रहे हैं? Automappers लोगों द्वारा इसकी अनुशंसा नहीं की जाती है। –

+2

@ ब्रायन - हां। क्यों नहीं? मेरा मतलब है कि मैंने सोचा कि ऑटो मैपर का पूरा बिंदु है। अन्यथा मुझे ऑटो मैपर के उद्देश्य को हराकर हाथ से सारी चीजें बनाना है। फिर मैं हाथ से मॉडल देखने के लिए डोमेन को मानचित्र भी कर सकता हूं। – chobo2

उत्तर

1

आपकी प्राप्त होने वाली त्रुटि इसलिए है क्योंकि आप अपने ऑब्जेक्ट ग्राफ़ में एक से अधिक स्तर की गहराई से घोषणाओं की घोषणा नहीं कर सकते हैं।

क्योंकि आपने केवल एक संपत्ति पोस्ट की है जो आपको यह कोड देने के लिए कठिन है जो इस काम को करेगी। एक विकल्प है अपनी व्यूमोडेल प्रॉपर्टी को MyTestTestId में बदलना और सम्मेलन स्वचालित रूप से उस पर उठाए जाएंगे।

+0

मैंने कुछ और गुण जोड़े। – chobo2

+0

एक और बात मैंने अपनी सामग्री को चारों ओर बदल दिया ताकि इसे सम्मेलनों में उठाया जा सके लेकिन यह काम नहीं करता है। मैंने चयनित उत्पाद उत्पाद को उत्पाद आईडी और उत्पाद आईडी (मेरे डोमेन में) में आईडी में बदल दिया। अभी भी बांध नहीं है। – chobo2

+0

डुएकर काम से जवाब –

25

नक्शा नेस्टेड संरचनाओं को मानचित्र करने के लिए, आपको मैपफ़्रॉम तर्क में एक नई वस्तु बनाने की आवश्यकता है।

उदाहरण

मैपिंग:

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 एन संकल्प का उपयोग करें।

ऐसे ही एक समाधानकर्ता वर्ग बनाएँ:

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 द्वारा दिए गए सही उत्तर की मदद करनी चाहिए:

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

नोट:: AutoMapper - Deep level mapping

यह तुम क्या जरूरत है आप इस बिंदु पर Mapper.CreateMap से दूर जाने की कोशिश करनी चाहिए , यह अप्रचलित है और जल्द ही असमर्थित होगा।

संबंधित मुद्दे