[C#] Automapper के साथ एक संपत्ति मैपिंग अनदेखा करें


Answers

मैं शायद एक पूर्णतावादी का थोड़ा सा हूँ; मुझे वास्तव में ForMember (..., x => x.Ignore ()) वाक्यविन्यास पसंद नहीं है। यह एक छोटी सी चीज है, लेकिन यह मेरे लिए मायने रखती है। मैंने इसे विस्तारित करने के लिए इस विस्तार विधि को लिखा है:

public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map,
    Expression<Func<TDestination, object>> selector)
{
    map.ForMember(selector, config => config.Ignore());
    return map;
}

इसका उपयोग इस प्रकार किया जा सकता है:

Mapper.CreateMap<JsonRecord, DatabaseRecord>()
        .Ignore(record => record.Field)
        .Ignore(record => record.AnotherField)
        .Ignore(record => record.Etc);

आप इसे params साथ काम करने के लिए भी लिख सकते हैं, लेकिन मुझे लैम्ब्स के भार के साथ एक विधि की तरह पसंद नहीं है।

Question

मैं ऑटोमैपर का उपयोग कर रहा हूं और मेरे पास निम्न परिदृश्य है: क्लास ऑर्डरमोडेल में 'ProductName' नामक एक संपत्ति है जो डेटाबेस में नहीं है। तो जब मैं मैपिंग करने की कोशिश करता हूं:

Mapper.CreateMap<OrderModel, Orders>(); 

यह एक अपवाद उत्पन्न करता है:

"Project.ViewModels.OrderModel पर निम्नलिखित 1 गुण मैप नहीं किए गए हैं: 'ProductName'

मैंने अनुमान के लिए ऑटोमैपर की विकी पर विपरीत मामला पढ़ा है (अतिरिक्त विशेषता गंतव्य पर है, न कि स्रोत में जो वास्तव में मेरा मामला है)

मैं इस संपत्ति के मानचित्रण को बनाने के लिए ऑटोमैपर से कैसे बच सकता हूं?




एक मॉडल मॉडल पर एक दृश्य मॉडल को मैप करते समय, गंतव्य सदस्य सूची की बजाय स्रोत सदस्य सूची को सत्यापित करने के लिए यह बहुत साफ हो सकता है

Mapper.CreateMap<OrderModel, Orders>(MemberList.Source); 

अब मेरी मैपिंग सत्यापन विफल नहीं होती है, किसी अन्य Ignore() आवश्यकता होती है, हर बार जब मैं अपनी डोमेन कक्षा में कोई संपत्ति जोड़ता हूं।




बस इसे स्वचालित रूप से करने का प्रयास करने वाले किसी भी व्यक्ति के लिए, आप गंतव्य प्रकार पर मौजूद मौजूदा गुणों को अनदेखा करने के लिए उस एक्सटेंशन विधि का उपयोग कर सकते हैं:

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var sourceType = typeof(TSource);
    var destinationType = typeof(TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
        && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

अनुसरण के रूप में इस्तेमाल किया जाना है:

Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();

टिप के लिए जेनसर के लिए धन्यवाद :)

स्रोत: http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/




हैलो सब कृपया इसका इस्तेमाल करें यह ठीक काम कर रहा है ... ऑटो मैपर के लिए एकाधिक का उपयोग करें। सी # में मेम्बर

        if (promotionCode.Any())
        {
            Mapper.Reset();
            Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0))))
                .ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day"))
                .ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName)))
                .ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName)))
                .ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg)))
                .ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate))); 
            var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode);
            return userPromotionModel;
        }
        return null;