दिलचस्प पोस्ट
तत्व आईडी के साथ जेएस फंक्शन नाम का विरोध क्यों होता है? पायथन पुनः। एफंडॉल अजीब व्यवहार करता है प्रमाणीकरण एक या अधिक संस्थाओं के लिए विफल रहा। अधिक विवरणों के लिए 'EntityValidationErrors' संपत्ति देखें एचटीएमएल। डॉपडाउनलिस्ट में <option> एचटीएमएल वर्ग टैग जोड़ना उपयोगकर्ता को छवि के लिए कैमरा या गैलरी चुनने की अनुमति दें npm वैश्विक पथ उपसर्ग अगर जैकसन को सीरियलाइजेशन के दौरान एक फ़ील्ड को अनदेखा करने के लिए कहें तो इसका मूल्य शून्य है? क्या यह वास्तव में एक सामान्य अपवाद पकड़ने के लिए बुरा है? अजगर: सूचियों की एक सूची से डुप्लिकेट को निकालना एफओपी में आर और आरबी के बीच अंतर क्या है अनपेक्षित CFBundleExecutable कुंजी क्यों / जब आप नेट में नेस्टेड कक्षाओं का उपयोग करना चाहिए? या आपको नहीं करना चाहिए? PHP सत्र कैसे काम करते हैं? (नहीं "वे कैसे उपयोग किया जाता है?") कैसे मैथ। पोव () को एनएटी फ्रेमवर्क में लागू किया जाता है? पूंजी पत्रों से पहले रिक्त स्थान जोड़ें

ऑटोमैपर: "बाकी को अनदेखा करें"?

क्या ऑटोमैपर को उन सभी गुणों को अनदेखा करने का एक तरीका है जो स्पष्ट रूप से मैप किए गए हैं?

मेरे पास बाहरी डीटीओ कक्षाएं हैं जो बाहर से बदलने की संभावना है और मैं स्पष्ट रूप से अनदेखा करने के लिए प्रत्येक संपत्ति को निर्दिष्ट करने से बचना चाहूंगा, क्योंकि नए गुणों को जोड़ने से मेरे खुद के ऑब्जेक्ट में मैप करने की कोशिश करते हुए कार्यक्षमता (अपवादों के कारण) को तोड़ दिया जाएगा।

वेब के समाधान से एकत्रित समाधान "ऑटोमैपर: "बाकी को अनदेखा करें"?"

यह एक एक्सटेंशन विधि है जो मैंने लिखा है कि गंतव्य पर सभी गैर मौजूदा गुणों पर ध्यान नहीं दिया गया है। यकीन नहीं है कि यह अभी भी उपयोगी होगा क्योंकि प्रश्न दो वर्ष से अधिक पुराना है, लेकिन मुझे एक ही मुद्दे पर दांव लगाना पड़ा, जिससे बहुत सारे मैन्युअल अनदेखा कॉल जोड़ दिए गए।

 public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination> (this IMappingExpression<TSource, TDestination> expression) { var flags = BindingFlags.Public | BindingFlags.Instance; var sourceType = typeof (TSource); var destinationProperties = typeof (TDestination).GetProperties(flags); foreach (var property in destinationProperties) { if (sourceType.GetProperty(property.Name, flags) == null) { expression.ForMember(property.Name, opt => opt.Ignore()); } } return expression; } 

उपयोग:

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

अद्यतन : जाहिरा तौर पर यह सही ढंग से काम नहीं करता है अगर आपके पास कस्टम मैपिंग हैं क्योंकि यह उन्हें ओवरराइट करता है। मुझे लगता है कि यह अभी भी काम कर सकता है अगर कॉल अनदेखा करेंअभी नैनो पहले और फिर कस्टम मैपिंग बाद में

schdr का समाधान (इस प्रश्न का उत्तर के रूप में) है जो Mapper.GetAllTypeMaps() का उपयोग करता है यह पता लगाने के लिए कि कौन से प्रॉपर्टी अप्रयुक्त हैं और ऑटो उन्हें अनदेखा करते हैं मेरे लिए एक अधिक मजबूत समाधान की तरह लगता है

मैंने किसी भी मौजूदा मानचित्र को अधिलेखित नहीं करने के लिए जेनसर्स का एक्सटेंशन अपडेट कर दिया है I

 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>() .ForMember(prop => x.Property, opt => opt.MapFrom(src => src.OtherProperty)) .IgnoreAllNonExisting(); 

मैं इसे निम्न तरीके से करने में सक्षम रहा हूं:

 Mapper.CreateMap<SourceType, DestinationType>().ForAllMembers(opt => opt.Ignore()); Mapper.CreateMap<SourceType, DestinationType>().ForMember(/*Do explicit mapping 1 here*/); Mapper.CreateMap<SourceType, DestinationType>().ForMember(/*Do explicit mapping 2 here*/); ... 

नोट: मैं ऑटोमैपर v.2.0 का उपयोग कर रहा हूँ।

मुझे जो सवाल समझा गया था, उस स्थान पर ऐसे क्षेत्र हैं जहां स्रोत में एक मैप किए गए फ़ील्ड नहीं हैं, इसलिए आप उन गैर मैप किए गए गंतव्य क्षेत्रों को अनदेखा करने के तरीकों की तलाश कर रहे हैं।

इन विस्तार विधियों को कार्यान्वित करने और उनका उपयोग करने के बजाय आप उपयोग कर सकते हैं

 Mapper.CreateMap<destinationModel, sourceModel>(MemberList.Source); 

अब ऑटोमैपर जानता है कि उसे केवल मान्य करना होगा कि सभी स्रोत फ़ील्ड मैप किए गए हैं, लेकिन अन्य तरह से नहीं।

.TypeMap 5.0 के अनुसार, .TypeMap पर .TypeMap संपत्ति IMappingExpression हो गई है, जिसका अर्थ है 4.2 समाधान अब काम नहीं करता है। मैंने एक समाधान बनाया है जो मूल कार्यक्षमता का उपयोग करता है लेकिन एक अलग सिंटैक्स के साथ:

 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Src, Dest>(); cfg.IgnoreUnmapped(); // Ignores unmapped properties on all maps cfg.IgnoreUnmapped<Src, Dest>(); // Ignores unmapped properties on specific map }); // or add inside a profile public class MyProfile : Profile { this.IgnoreUnmapped(); CreateMap<MyType1, MyType2>(); } 

कार्यान्वयन:

 public static class MapperExtensions { private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr) { foreach (string propName in map.GetUnmappedPropertyNames()) { if (map.SourceType.GetProperty(propName) != null) { expr.ForSourceMember(propName, opt => opt.Ignore()); } if (map.DestinationType.GetProperty(propName) != null) { expr.ForMember(propName, opt => opt.Ignore()); } } } public static void IgnoreUnmapped(this IProfileExpression profile) { profile.ForAllMaps(IgnoreUnmappedProperties); } public static void IgnoreUnmapped(this IProfileExpression profile, Func<TypeMap, bool> filter) { profile.ForAllMaps((map, expr) => { if (filter(map)) { IgnoreUnmappedProperties(map, expr); } }); } public static void IgnoreUnmapped(this IProfileExpression profile, Type src, Type dest) { profile.IgnoreUnmapped((TypeMap map) => map.SourceType == src && map.DestinationType == dest); } public static void IgnoreUnmapped<TSrc, TDest>(this IProfileExpression profile) { profile.IgnoreUnmapped(typeof(TSrc), typeof(TDest)); } } 

प्रश्न पूछने के बाद से कुछ साल बाद भी, लेकिन ऑटोमैपर (3.2.1) के वर्तमान संस्करण का उपयोग करते हुए यह एक्सटेंशन विधि मुझे साफ दिखती है:

 public static IMappingExpression<TSource, TDestination> IgnoreUnmappedProperties<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) { var typeMap = Mapper.FindTypeMapFor<TSource, TDestination>(); if (typeMap != null) { foreach (var unmappedPropertyName in typeMap.GetUnmappedPropertyNames()) { expression.ForMember(unmappedPropertyName, opt => opt.Ignore()); } } return expression; } 

AutoMapper के संस्करण 5.0.0-beta-1 के लिए ForAllOtherMembers विस्तार विधि का परिचय है ताकि आप यह कर सकते हैं:

 CreateMap<Source, Destination>() .ForMember(d => d.Text, o => o.MapFrom(s => s.Name)) .ForMember(d => d.Value, o => o.MapFrom(s => s.Id)) .ForAllOtherMembers(opts => opts.Ignore()); 

ध्यान रखें कि प्रत्येक संपत्ति को स्पष्ट रूप से मैप करने के लिए एक फायदा है क्योंकि आप मानचित्रण की समस्याओं को चुपचाप न होने में कभी भी परेशान नहीं करेंगे, जब आप किसी संपत्ति को मैप करने के लिए भूल जाते हैं।

शायद आपके मामले में यह हो सकता है कि सभी अन्य सदस्यों को अनदेखा करना और फिर से आने के लिए एक TODO जोड़ना और इस वर्ग में होने वाले परिवर्तनों की आवृत्ति बसाए जाने के बाद ये स्पष्ट करें।

उन लोगों के लिए जो संस्करण 4.2.0 और इसके बाद के संस्करण में गैर-स्टैटिक एपीआई का उपयोग कर रहे हैं, निम्न एक्सटेंशन विधि ( यहां AutoMapperExtensions एक्स्टेंशन क्लास में पाया गया है ) का उपयोग किया जा सकता है:

 // from http://stackoverflow.com/questions/954480/automapper-ignore-the-rest/6474397#6474397 public static IMappingExpression IgnoreAllNonExisting(this IMappingExpression expression) { foreach(var property in expression.TypeMap.GetUnmappedPropertyNames()) { expression.ForMember(property, opt => opt.Ignore()); } return expression; } 

यहां महत्वपूर्ण बात यह है कि एक बार स्थैतिक एपीआई को हटा दिया जाता है, जैसे कि Mapper.FindTypeMapFor कोड के रूप में कोड नहीं करता है। Mapper.FindTypeMapFor अब काम नहीं करेगा, इसलिए expression.TypeMap का उपयोग। Mapper.FindTypeMapFor फ़ील्ड।

ऑटॉमैपर 5.0 के लिए सभी अनमाप्ड गुणों को छोड़ने के लिए आपको बस रखा जाना चाहिए

.ForAllOtherMembers (x => x.Ignore ());

आपके प्रोफाइल के अंत में

उदाहरण के लिए:

 internal class AccountInfoEntityToAccountDtoProfile : Profile { public AccountInfoEntityToAccountDtoProfile() { CreateMap<AccountInfoEntity, AccountDto>() .ForMember(d => d.Id, e => e.MapFrom(s => s.BankAcctInfo.BankAcctFrom.AcctId)) .ForAllOtherMembers(x=>x.Ignore()); } } 

इस मामले में केवल आउटपुट ऑब्जेक्ट के लिए आईडी फ़ील्ड को हल किया जाएगा अन्य सभी को छोड़ दिया जाएगा। एक जादू की तरह काम करता है, लगता है हमें अब किसी भी मुश्किल एक्सटेंशन की ज़रूरत नहीं है!

मैंने ऑटोमैपर 4.2 के लिए रॉबर्ट श्रोएडर के उत्तर को अपडेट किया है। गैर-स्थिर मैपर कॉन्फ़िगरेशन के साथ, हम Mapper.GetAllTypeMaps() उपयोग नहीं कर सकते हैं, लेकिन expression में आवश्यक TypeMap संदर्भ हैं:

 public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) { foreach (var property in expression.TypeMap.GetUnmappedPropertyNames()) { expression.ForMember(property, opt => opt.Ignore()); } return expression; } 

आप निर्दिष्ट करना चाहते हैं कि कुछ सदस्यों को अनदेखा क्यों किया जाए? क्या कोई सम्मेलन या आधार वर्ग, या विशेषता है जिसे आप लागू करना चाहते हैं? एक बार जब आप स्पष्ट रूप से सभी मैपिंग निर्दिष्ट करने के व्यवसाय में आ जाए, तो मुझे यकीन नहीं है कि आप जिस मूल्य को ऑटोमैपर से प्राप्त करेंगे

यह एक पुराना सवाल है लेकिन मुझे लगता है कि मैं किसी और के लिए मेरा जवाब पोस्ट करेगा जैसे मैं था।

मैं ConstructUsing का उपयोग करें, ForAllMembers उदाहरण के साथ उपेक्षा ऑब्जेक्ट initializer

  Mapper.CreateMap<Source, Target>() .ConstructUsing( f => new Target { PropVal1 = f.PropVal1, PropObj2 = Map<PropObj2Class>(f.PropObj2), PropVal4 = f.PropVal4 }) .ForAllMembers(a => a.Ignore()); 

कई सदस्यों की अनदेखी के बारे में एकमात्र सूचना यह धागा है – http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f मुझे लगता है कि समान क्लासेस के लिए समान गुणों को अनदेखा करने के लिए आप ProvingCommonBaseClass कॉन्फ़िगरेशन में उपयोग की गई चाल का उपयोग कर सकते हैं।
और "बाकी की अनदेखी" कार्यक्षमता के बारे में कोई जानकारी नहीं है मैंने पहले कोड को देखा है और मुझे लगता है कि ऐसी कार्यक्षमता जोड़ने में बहुत मुश्किल है साथ ही आप कुछ विशेषता का उपयोग करने की कोशिश कर सकते हैं और इसके साथ चिह्नित गुणों को नजरअंदाज कर सकते हैं और सभी चिह्नित गुणों को अनदेखा करने के लिए कुछ सामान्य / सामान्य कोड जोड़ सकते हैं।

3.3.1 के संस्करण में आप केवल IgnoreAllPropertiesWithAnInaccessibleSetter() या IgnoreAllSourcePropertiesWithAnInaccessibleSetter() तरीकों का उपयोग कर सकते हैं।

आप केवल इस तरह की जरूरत के लिए अधिलेखित के लिए, AllAmembers का उपयोग कर सकते हैं

 public static IMappingExpression<TSource, TDest> IgnoreAll<TSource, TDest>(this IMappingExpression<TSource, TDest> expression) { expression.ForAllMembers(opt => opt.Ignore()); return expression; } 

सावधान रहें, यह सभी को अनदेखा कर देगा, और यदि आप कस्टम मैपिंग नहीं जोड़ेंगे, तो वे पहले ही उपेक्षा कर चुके हैं और काम नहीं करेंगे

भी, मैं कहना चाहता हूँ, अगर आपके पास ऑटोमैपर के लिए यूनिट टेस्ट है और आप यह जांचते हैं कि सभी गुणों के साथ सभी मॉडल सही तरीके से मैप किए गए हैं, आपको इस तरह के एक्सटेंशन विधि का उपयोग नहीं करना चाहिए

आपको उपेक्षा की स्पष्ट रूप से लिखना चाहिए

मुझे पता है यह एक पुराना सवाल है, लेकिन आपके प्रश्न में @ जेमोर्ड्क:

आप इसे प्रोफ़ाइल में एक श्रृंखलित CreateMap () अभिव्यक्ति में कैसे उपयोग करेंगे?

आप इस तरह से इस तरह के प्रोफ़ाइल ctor अंदर जवाब का उपयोग कर सकते हैं

 this.IgnoreUnmapped(); CreateMap<TSource, Tdestination>(MemberList.Destination) .ForMember(dest => dest.SomeProp, opt => opt.MapFrom(src => src.OtherProp));