অটোম্যাপার: "বাকিগুলি উপেক্ষা করুন"?


205

স্পষ্টভাবে ম্যাপ করা জিনিসগুলি বাদে অটম্যাপারকে সমস্ত সম্পত্তি উপেক্ষা করার জন্য কী উপায় আছে?

আমার বাহ্যিক ডিটিও ক্লাস রয়েছে যা সম্ভবত বাইরে থেকে পরিবর্তিত হতে পারে এবং আমি প্রতিটি সম্পত্তিকে স্পষ্টভাবে উপেক্ষা করার বিষয়টি উল্লেখ করা এড়াতে চাই, যেহেতু নতুন সম্পত্তি যুক্ত করার সাথে আমার নিজের বস্তুগুলিতে ম্যাপ দেওয়ার চেষ্টা করার সময় কার্যকারিতা (ব্যতিক্রম ঘটবে) নষ্ট হয়ে যায়।


1
ValueInjecter valueinjecter.codeplex.com/docamentation দিয়ে আপনি ValueInjections তৈরি করেন যার নির্দিষ্ট মর্যাদাগুলির মধ্যে তাদের ম্যাপিং অ্যালগরিদম এবং মানচিত্র রয়েছে এবং তারা বাকী বৈশিষ্ট্যগুলির বিষয়ে চিন্তা করে না
ওমু

24
অটোমেপার> সংস্করণ 5 ব্যবহারকারীদের জন্য, উত্তরগুলির .ForAllOtherMembers(opts => opts.Ignore())
বিশদটি

@Schneider "। ForOllOtherMeبار (opts => opts.Ignore ())" এখানে "IgnoreAllNonExisting" এক্সটেনশনের সাথে আলাদা, প্রধান পার্থক্যটি যদি আপনি "স্পষ্টভাবে সম্পত্তি কনফিগার না করে থাকেন তবে" .আরঅরঅর্থমেমবার্স (opts => opts.Ignore ( )) "আপনি ম্যাপযুক্ত কিছুই পাবেন না। স্পষ্টভাবে কনফিগার সম্পত্তি ছাড়াই "IgnoreAllNonExisting" ব্যবহার করুন, আপনি এখনও কিছু সংখ্যক সম্পত্তি ম্যাপযুক্ত (একই নামের বৈশিষ্ট্য) পাবেন।
ড্রাগন

হ্যাঁ. ফরএলওথেরমেমবার্স এর উত্তর। উপেক্ষা না করা উত্তরগুলি কনফিগার-বৈধ-দাবী পাস হওয়ার কারণ ছাড়া কিছুই করে না, কারণ বিনা মেম্বার সদস্যরা যেভাবেই উপেক্ষা করে।
N73k

লক্ষণীয় যে এটি করার সময়, আপনি ক্লাস ম্যাপ করার ক্ষেত্রে সম্ভাব্য প্রাসঙ্গিক বা গুরুত্বপূর্ণ পরিবর্তনগুলি স্পষ্টভাবে লুকিয়ে রাখেন। প্রতিটি সম্পত্তির জন্য স্পষ্ট ম্যাপিং থাকা যখনই ম্যাপযুক্ত শ্রেণি পরিবর্তন করে, আপনাকে সঠিকভাবে মূল্যায়ন করতে বাধ্য করবে তখনই আপনাকে একটি ভাঙ্গা পরীক্ষা দিয়ে যাবে। (আপনি AssertConfigurationIsValid()কল দিয়ে একটি পরীক্ষা করেছেন তা দেওয়া হয়েছে ) এর কারণে, আমি "বাকীগুলিকে উপেক্ষা করুন" একটি এন্টিপ্যাটার্ন হিসাবে বিবেচনা করি।
Systad

উত্তর:


83

এটি আমি লিখেছি এমন একটি এক্সটেনশন পদ্ধতি যা গন্তব্যে থাকা সমস্ত অ-বিদ্যমান বৈশিষ্ট্য উপেক্ষা করে। প্রশ্নটি আরও দুই বছরের বেশি পুরানো হওয়ায় এটি এখনও কার্যকর হবে কিনা তা নিশ্চিত নন, তবে আমি অনেকগুলি ম্যানুয়াল কল কল উপেক্ষা করার পরে একই সমস্যাটিতে চলে এসেছি।

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

আপডেট : সম্ভবত আপনার কাস্টম ম্যাপিংগুলি থাকলে এটি সঠিকভাবে কাজ করে না কারণ এটি সেগুলি ওভাররাইট করে। আমার ধারণা আমি প্রথমে IgnoreAllNonExisting কল করুন এবং তারপরে কাস্টম ম্যাপিংগুলি পরে এটি কাজ করতে পারে।

schdr এর একটি সমাধান (এই প্রশ্নের উত্তর হিসাবে) রয়েছে যা Mapper.GetAllTypeMaps()কোন বৈশিষ্ট্যগুলি আনম্যাপড এবং অনুসন্ধানে স্বয়ংক্রিয়ভাবে সেগুলি উপেক্ষা করে তা ব্যবহার করে। আমার কাছে আরও দৃust় সমাধানের মতো মনে হচ্ছে।


আমি কিছু সময়ের জন্য অটোম্যাপার ব্যবহার করি নি, তবে আপনার উত্তরটি যদি এটি আপনার পক্ষে কার্যকর হয় তবে আমি গ্রহণ করব :)
ইগোর ব্রেজক

2
ধন্যবাদ !! আমি এটি খুব সুবিধাজনক খুঁজে পেয়েছি। স্বতন্ত্রভাবে সম্পত্তি উপেক্ষা করা আমার পরিস্থিতিতে অটোম্যাপার ব্যবহারের উদ্দেশ্যকে পরাস্ত করেছিল।
ড্যানিয়েল রবিনসন

ওভাররাইট সমস্যা নেই এমন একজনের জন্য পরবর্তী উত্তরটি দেখুন
জেসন কোইন

3
এই পদ্ধতিটি অটোম্যাপার নেটিভ কোডে থাকা উচিত! খুব সুন্দর, ধন্যবাদ!
ফিলিপ ওরিয়ানি

2
এফওয়াইআই, জিমি নিজেই (অটোম্যাপার লেখক) নীচে মন্তব্য করেছেন যে @ নাজিমের উত্তর 5+ সংস্করণের জন্য সঠিক
মূল্যবান 7

244

আমি যা বুঝতে পেরেছি তা থেকে প্রশ্নটি হল যে গন্তব্যটিতে এমন ক্ষেত্র রয়েছে যার উত্সটিতে কোনও ম্যাপযুক্ত ক্ষেত্র নেই, যার কারণে আপনি এই ম্যাপযুক্ত নয় এমন গন্তব্য ক্ষেত্রগুলি উপেক্ষা করার উপায় অনুসন্ধান করছেন।

এই এক্সটেনশন পদ্ধতিটি প্রয়োগ এবং ব্যবহারের পরিবর্তে আপনি কেবল ব্যবহার করতে পারেন

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

এখন অটোম্যাপার জানে যে এটির উত্স ক্ষেত্রগুলি ম্যাপ করা হয়েছে তবে এটি অন্যভাবে নয় কেবল যাচাই করা দরকার।

আপনি এটি ব্যবহার করতে পারেন:

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

10
এই উত্তরের আরও বেশি উচ্চারণ হওয়া উচিত, এমনকি উত্তর হিসাবে চিহ্নিতও হতে পারে। এটি আমার সমস্যা সমাধান করেছে এবং একইভাবে MemberList.Destinationঅপ্সের সমস্যা সমাধান করবে।
টেড হানসেন

1
আপনি যদি উত্স এবং গন্তব্য উভয় জায়গাতেই কয়েকটি সম্পত্তি উপেক্ষা করতে চান তবে এটি কাজ করবে না :)
রিয়েলউইলওয়োকা

62
পরে যে কোনও ব্যক্তির কাছে, এটি 5.0
জিমি বোগার্ড

3
নিফটি দেখায় কিন্তু আমার জন্য কাজ করে নি .. আমি উত্স এবং গন্তব্য চেষ্টা করেছি, তবে এটি একই সম্পত্তি সম্পত্তি মানচিত্রে হারিয়ে যাওয়া সম্পর্কে অভিযোগ করে চলেছে
সোনিক সোল

1
6.0.2 ব্যবহার করে এবং এটি সময়কালে কাজ করে না। গন্তব্য থেকে উত্স পর্যন্ত ম্যাপ করা হয়নি এমন যে কোনও সম্পত্তি, নাল এবং 0 টি সহ উত্সগুলিতে বৈশিষ্ট্যগুলি ওভাররাইট করে। প্লাস কোডটি আপনি কী করছেন তা স্পষ্ট করে না, বিশেষত যদি আপনি একটি দলে কাজ করছেন। এই কারণেই আমি এই কোডটি তীব্রভাবে অপছন্দ করি এবং কেন আমি প্রস্তাবিত উত্তরের মতো "IgnoreAllNonExisting"
স্কাল্লাজ

222

আমি বিদ্যমান কোন মানচিত্রের ওভাররাইট না করতে ক্যান জেনার এক্সটেনশন আপডেট করেছি।

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

4
+1, এই সমাধান পোস্ট করার জন্য আপনাকে ধন্যবাদ। এটা আমার যখন আমি সমাধান ব্যবহার অদ্ভুত বাগ figuring জন্য ঘন্টার tooked goo.gl/rG7SL পর্যন্ত আমি আবার এই পোস্টে পদস্খলন।
নর্ডিন

3
আমি এটি নীচে Yohanb এর পদ্ধতি সুপারিশ। কিছু কোণার কেস রয়েছে যা এটি কাজ করে না এটির জন্য এটি উপস্থিত হয়।
জন বার্কার

3
এটি অটোম্যাপার ৪.২ এ করা যাবে? ( Mapper.GetAllTypeMaps()অবচিত হয়)
শ্রীমশাল

14
AutoMapper 5+ সংস্করণের জন্য মাত্র প্রতিস্থাপন Mapper.GetAllTypeMaps()সঙ্গে Mapper.Configuration.GetAllTypeMaps()। এখানে github.com
সের্গেই জি।

5
নতুন এটি পড়ার জন্য। এই উত্তরটি অটোম্যাপার 2 এর জন্য এবং এই মন্তব্যটি লেখার সময় আমরা সংস্করণ 6 এ আছি This এটি একটি হ্যাক এবং অনেক ক্লিনার উপায় মেমরিলিস্ট এনাম ব্যবহার করছে। 1839 গিথুব ইস্যু এবং আরও ভাল সমাধান দেখুন। github.com/AutoMapper/AutoMapper/issues/1839 সুতরাং উদাহরণস্বরূপ: stackoverflow.com/a/31182390/3850405
Ogglas

83

আমি নিম্নলিখিত পদ্ধতিতে এটি করতে সক্ষম হয়েছি:

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 ব্যবহার করছি।


4
তোমাকে অনেক ধন্যবাদ! ইহা যাদুর মত কাজ করে. আমি চেইন প্রথম চেষ্টা কল কিন্তু ForAllMembers শুধু অকার্যকর :( আসতে করে একটি পূর্ববর্তী IgnoreAll পরে পরিবর্তন করা যাবে এটি সুস্পষ্ট ছিল না।।
SeriousM

5
আমিও এইভাবে পছন্দ করি না .. যদি আপনার 50 জন সদস্য থাকে এবং আপনি 25 টি উপেক্ষা করতে চান .. তবে আপনি যদি এখনও 25 সদস্যকে উপেক্ষা করতে চান তবে অটোম্যাপারের কী দরকার। যদি নামগুলি মিলে যায়, এবং এমন বৈশিষ্ট্য রয়েছে যা মিলছে না .. অটোম্যাপারকে আনম্যাপড বৈশিষ্ট্যগুলির সাথে মিল না দেওয়ার জন্য এবং সমস্ত টাইপিং পাস করে কেন পরিষ্কার করা হবে না?
sksallaj

71

অটোম্যাপ্পারের 5.0.0-বিটা -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());

সচেতন থাকুন যে প্রতিটি সম্পত্তি স্পষ্টভাবে ম্যাপিংয়ের একটি সুবিধা রয়েছে কারণ আপনি যখন কোনও সম্পত্তি মানচিত্র করতে ভুলে যান তখন নিঃশব্দে ম্যাপিংয়ের সমস্যা কখনই আসবে না arise

সম্ভবত আপনার ক্ষেত্রে অন্যান্য শ্রেণীর সদস্যদের উপেক্ষা TODOকরে এই শ্রেণীর পরিবর্তনের ফ্রিকোয়েন্সি স্থির হয়ে যাওয়ার পরে এই বিষয়টি স্পষ্ট করে দেওয়া আরও যুক্তিযুক্ত হতে পারে।


3
সংস্করণ 5 অবধি অবাক করে দিয়েছিল Look দেখুন কতগুলি আপ-ভিটিস এবং এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করেছেন ... অটোম্যাপারের প্রশাসনের সাথে আমি কিছু ভেবে অবাক হচ্ছি?
জ্যাক উকলেজা

এর জন্য আপনাকে ধন্যবাদ, এটিতে এটিকে স্ক্রোল করতে আমাকে কিছুটা সময় নিয়েছিল তবে এটি পুরোপুরি কার্যকর হয়।
কোবলস্টিংকস

2
এমনকি আপনি প্রথমে ফরএলওথেরমেমবার্স লাইনটি রেখে দিতে পারেন এবং জিনিসগুলি একই কাজ করবে যা আপনার কাছে কোনও ধরণের বেস শ্রেণির কনফিগারেশন থাকলে ভাল।
N73k

এটি এখন পছন্দসই পদ্ধতি। ভাবছেন যদি ওপি গ্রহণযোগ্য উত্তর পরিবর্তন করতে পারে?
চেজ ফ্লোরেল

1
উত্স অবজেক্টে বৈশিষ্ট্য উপেক্ষা করার সমতুল্য কি আছে? এরকম কিছু ForAllOtherSourceMembers?
সুপারজেএমএন

44

অটোম্যাপার 5.0 হিসাবে .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
একটি এ শৃঙ্খলাবদ্ধ CreateMap<TSource,TDest>()অভিব্যক্তি আপনি কীভাবে এটি ব্যবহার করবেন Profile?
jmoerdyk

2
এর জন্য ধন্যবাদ. GetUnmapedPropertyNames পদ্ধতি উত্স এবং গন্তব্য উভয়টিতেই সমস্ত মানহীন সম্পত্তি সম্পত্তি ফেরত দেয় যা বিপরীত মানচিত্রে বিরতি বলে মনে হচ্ছে, তাই মোড়কবিহীন সম্পত্তি উত্স বা গন্তব্যস্থলে ছিল কিনা তা যাচাই করার জন্য আমাকে IgnoreUnmaped এ একটি ছোট পরিবর্তন করতে হয়েছিল সেই অনুযায়ী। সমস্যা এবং আপডেটটি দেখানোর জন্য এখানে একটি মূর্খতা রয়েছে
মুন

1
আমি আপনার অনুসন্ধানগুলি অন্তর্ভুক্ত করার জন্য আমার উত্তরটি আপডেট করেছি - আমি উত্স ম্যাপিংগুলি ব্যবহার করি না এটি এতক্ষণে আসে নি! ধন্যবাদ।
রিচার্ড

1
প্রতিবিম্ব উপলব্ধ না হয়ে এটি পিসিএলে কাজ করে না, গেটপ্রপার্টি (প্রোপনেম) বিদ্যমান নেই।
জর্জ টাসকোস

আমি দেখতে পাচ্ছি না যে এটি কীভাবে প্রশ্নের সমাধান, বা কীভাবে এটি কিছু করে। আনম্যাপযুক্ত বৈশিষ্ট্যগুলি ইতিমধ্যে উপেক্ষা করা হবে - কারণ সেগুলি আনম্যাপ করা নেই । পোস্টারটিতে বলা হয়েছে "প্রপস স্পষ্টভাবে ম্যাপ করা না থাকলে আপনি কীভাবে উপেক্ষা করবেন "। এর অর্থ হ'ল যদি আমার কাছে এসসিআর.মাইপ্রপ এবং ডেস্ট.মাইপ্রপ থাকে তবে মাইপ্রপের জন্য ম্যাপফ্র্যাম এবং ফর্ম মেম্বারে সুস্পষ্ট কল না থাকলে সেই ম্যাপিংটি উপেক্ষা করা উচিত। সুতরাং, ডিফল্ট ম্যাপিং উপেক্ষা করা প্রয়োজন। এই সমাধানটি কেবলমাত্র কনফিগার-বৈধ-দোষী জিনিসটি পাস করার জন্য ঘটায় - যা ম্যাপিংয়ের কাজ করার জন্য আপনার প্রয়োজন নেই।
N73k

17

প্রশ্নটি জিজ্ঞাসা করার কয়েক বছর হয়েছে, তবে অটোম্যাপ্পারের বর্তমান সংস্করণ (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;
}

16

যারা ব্যবহার করছেন জন্য অ স্ট্যাটিক এপিআই সংস্করণ 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আর কাজ করবে না, তাই expression.TypeMapক্ষেত্রটি ব্যবহার করুন ।


7
5.0 হিসাবে, expression.TypeMapআর উপলব্ধ নেই। 5.0
রিচার্ড

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)টাইপ সমস্যাগুলি সমাধান করতে আমাকে ব্যবহার করতে হয়েছিল।
নিক এম

16

অটোম্যাপার 5.0 এর জন্য সমস্ত আনম্যাপড বৈশিষ্ট্যগুলি এড়িয়ে যেতে আপনার কেবল দরকার

.ForAllOtherMembers (এক্স => 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());
    }
}

এই ক্ষেত্রে কেবলমাত্র আউটপুট অবজেক্টের জন্য আইডি ফিল্ডটি সমাধান করা হবে অন্য সমস্ত ছেড়ে যাওয়া হবে। কবজির মতো কাজ করে, মনে হয় আমাদের আর কোনও ছদ্মবেশী এক্সটেনশনের দরকার নেই!


10

অটোম্যাপার ৪.২-এর জন্য আমি রবার্ট শ্রয়েডারের উত্তর আপডেট করেছি। স্ট্যাটাসহীন ম্যাপার কনফিগারেশনের সাহায্যে আমরা ব্যবহার করতে পারি না 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;
}

অটোম্যাপার 5.0 এ কাজ করে না। IMappingExpression এ .TypeMap বৈশিষ্ট্যটি উপলভ্য নয়। ৫. + সংস্করণের জন্য রিচার্ডের উত্তরে
মাইকেল ফ্রেইডিজ

এএম 4.2 এর সাথে কাজ করে
লেজেক পি

8

আপনি কীভাবে নির্দিষ্ট সদস্যদের উপেক্ষা করে নির্দিষ্ট করতে পছন্দ করবেন? কোনও কনভেনশন, বা বেস ক্লাস, বা আপনি প্রয়োগ করতে চান এমন গুণাবলী রয়েছে? আপনি সমস্ত ম্যাপিং স্পষ্টভাবে উল্লেখ করার ব্যবসায়ের সাথে যুক্ত হয়ে গেলে, আপনি অটোম্যাপার থেকে কী মান পাবেন তা আমি নিশ্চিত নই।


জিমি, আপনার স্পষ্টকতা সম্পর্কে একটি বক্তব্য আছে। কীভাবে এটি সবচেয়ে মার্জিত উপায়ে অর্জন করা যায় সেই উপায় হিসাবে: বেস ক্লাস এবং বৈশিষ্ট্যগুলি এই পরিস্থিতিতে কাজ করবে না, যেহেতু লক্ষ্য শ্রেণিগুলি সত্যই আমার নিয়ন্ত্রণে নেই - তারা এক্সএসডি ডেটা চুক্তি থেকে স্বয়ংক্রিয়ভাবে জড়িত, তাই একটির কাছে প্রতিটি প্রজন্মের চক্রের পরে এই কোডটি ম্যানুয়ালি সম্পাদনা করতে। আমার ধারণা সমাধানটি কোনও কংক্রিটের ক্ষেত্রে নির্ভর করে। উইন্ডসর ক্যাসেলের অনুরূপ একটি সাবলীল ইন্টারফেসটি ধারকটিতে নিবন্ধকরণ করার জন্য কোন উপাদানগুলি সমাধান হতে পারে তা নির্বাচনের জন্য সরবরাহ করে?
ইগোর ব্রেজক

আহ যে এখন আরও বোধগম্য। এটি একটি আকর্ষণীয় বৈশিষ্ট্য, আমি এটি ২.১ সময়সীমার মধ্যে দেখব।
জিমি বোগার্ড

2
একটি কনফিগারযোগ্য মান রাখার বিষয়ে কীভাবে আপনি যেখানে সমস্ত অ-বিদ্যমান ক্ষেত্রগুলি "উপেক্ষা" করতে পারবেন।
রিকার্ডো সানচেজ

6
এটি প্রশ্নের উত্তর নয়।
ব্যবহারকারী 2864740

হাই জিমি, আপনি লেখক, সঠিক? আমি ডিফল্ট আচরণের কারণে (বিদ্যমান কোনও পতাকা দ্বারা নিয়ন্ত্রিত) হয়ে থাকা সমস্ত অস্তিত্বের সম্পত্তি উপেক্ষা করতে সক্ষম হতে চাই। এছাড়াও, অটোম্যাপার থেকে আমি একটি অদ্ভুত ত্রুটি করছি যা আমি বের করতে অক্ষম। এটি আমার কোনও নির্দিষ্ট বিবরণ দেয় না।
নাওমি

7

এটি একটি পুরানো প্রশ্ন বলে মনে হচ্ছে তবে আমি ভেবেছিলাম যে আমার মতো অন্য কারও জন্য আমার উত্তর পোস্ট করব।

আমি কনস্ট্রাক্ট ইউজিং, অবজেক্ট ইনিশিয়ালাইজার এবং ফরএলমেমার্স এড়ানোর উদাহরণ ব্যবহার করি eg

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

1

অনেক সদস্যকে উপেক্ষা করার একমাত্র ইনফ্রোমেশন হ'ল এই থ্রেড - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f । আমি মনে করি আপনি একই ধরণের ক্লাসের সাধারণ বৈশিষ্ট্য উপেক্ষা করার জন্য ProviderCommonBaseClassConfigration- এ ব্যবহৃত কৌশলটি ব্যবহার করতে পারেন।
এবং "বাকি উপেক্ষা করুন" কার্যকারিতা সম্পর্কে কোনও তথ্য নেই। আমি আগে কোডটি দেখেছি এবং আমার কাছে মনে হয়েছে যে এই জাতীয় কার্যকারিতা যুক্ত করা খুব এবং খুব কঠিন হবে। এছাড়াও আপনি কিছু বৈশিষ্ট্য ব্যবহার করার চেষ্টা করতে পারেন এবং এটির সাথে সম্পর্কিত বৈশিষ্ট্যগুলি উপেক্ষা করে চিহ্নিত করতে পারেন এবং সমস্ত চিহ্নিত বৈশিষ্ট্য উপেক্ষা করার জন্য কিছু জেনেরিক / সাধারণ কোড যুক্ত করতে পারেন।


1
সম্ভবত একটি উপায় হ'ল ফরএলেম্বার্স পদ্ধতিটি ব্যবহার করা এবং আমার নিজস্ব আইবেম্বার কনফিগারেশন এক্সপ্রেশন বাস্তবায়ন করা যা সেই বৈশিষ্ট্যগুলির সম্পত্তি নাম যুক্ত একটি স্ট্রিং পেয়ে থাকে যা উপেক্ষা করা উচিত নয় এবং তারপরে বাকী অংশটি দিয়ে যান এবং উপেক্ষা করুন () কল করুন। শুধু একটি ধারণা, আমি নিশ্চিত না এটি কার্যকর হবে কিনা।
ইগোর ব্রেজক

হ্যাঁ, এটিও কাজ করতে পারে তবে গুণাবলী ব্যবহারের চেয়ে এই পদ্ধতিটি আরও কৌশলযুক্ত তবে এটি আরও নমনীয়তার প্রস্তাব দেয়। এটি অত্যন্ত দুঃখের বিষয় যে কোনও রূপালী বুলেট নেই :(।
জিহোটকি

1

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আপনার প্রশ্নে @ জুমেরডিক:

কোনও প্রোফাইলে শৃঙ্খলিত ক্রিয়েটম্যাপ () এক্সপ্রেশনটিতে আপনি কীভাবে এটি ব্যবহার করবেন?

আপনি এই উত্তরটি প্রোফাইল কর্টারের ভিতরে ব্যবহার করতে পারেন

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

0

আপনি কেবলমাত্র এ জাতীয় ওভাররাইটের চেয়ে ওভাররাইট ব্যবহার করতে পারেন use

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

সাবধান থাকুন, এটি সকলকে উপেক্ষা করবে এবং আপনি যদি কাস্টম ম্যাপিং যুক্ত না করেন তবে তারা ইতিমধ্যে উপেক্ষা করা হবে এবং কাজ করবে না

এছাড়াও, আমি বলতে চাই, আপনার যদি অটোম্যাপারের জন্য ইউনিট পরীক্ষা থাকে। এবং আপনি পরীক্ষা করেছেন যে সমস্ত বৈশিষ্ট্যযুক্ত সমস্ত মডেল সঠিকভাবে ম্যাপ করেছে আপনার এ জাতীয় সম্প্রসারণ পদ্ধতি ব্যবহার করা উচিত নয়

আপনার স্পষ্টভাবে উপেক্ষা করা উচিত


-1

গন্তব্য প্রকারে বিদ্যমান বৈশিষ্ট্যগুলি উপেক্ষা করার জন্য বর্তমান (সংস্করণ 9) সমাধানটি হ'ল ফ্লিপড ম্যাপিং তৈরি করা এবং এটির বিপরীত হওয়া:

var config = new MapperConfiguration(cfg => {
  cfg.CreateMap<TheActualDestinationType, TheActualSourceType>().ReverseMap();
});

-2

3.3.1 সংস্করণে আপনি কেবল ব্যবহার IgnoreAllPropertiesWithAnInaccessibleSetter()বা IgnoreAllSourcePropertiesWithAnInaccessibleSetter()পদ্ধতি ব্যবহার করতে পারেন ।


6
এটি মূল পোস্টারের প্রশ্ন অনুযায়ী কাজ করে না। এই পদ্ধতিগুলি কেবল সুরক্ষিত বা ব্যক্তিগত সম্পত্তিগুলি উপেক্ষা করে, এমন বৈশিষ্ট্যগুলি নয় যা উত্স থেকে অনুপস্থিত তবে গন্তব্যের ধরণে উপস্থিত রয়েছে।
ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.