অটোম্যাপারের সাথে একটি সম্পত্তি ম্যাপিং উপেক্ষা করুন


285

আমি অটোম্যাপার ব্যবহার করছি এবং আমার নিম্নোক্ত দৃশ্যপট রয়েছে: ক্লাস অর্ডারমোডেলের 'প্রোডাক্টনাম' নামে একটি সম্পত্তি রয়েছে যা ডাটাবেসে নেই। সুতরাং আমি যখন ম্যাপিংটি দিয়ে চেষ্টা করব:

Mapper.CreateMap<OrderModel, Orders>(); 

এটি একটি ব্যতিক্রম উত্পন্ন করে:

"প্রোজেক্ট.ভিউমোডেলস.অর্ডারমোডেলে নিম্নলিখিত 1 টি বৈশিষ্ট্য ম্যাপ করা হয়নি: 'প্রোডাক্টনাম'

আমি বিপরীত ক্ষেত্রে প্রজেকশনগুলির জন্য অটোম্যাপারের উইকিতে পড়েছি (অতিরিক্ত বৈশিষ্ট্যটি গন্তব্যে রয়েছে, উত্সটিতে নয় যা আসলে আমার ক্ষেত্রে)

এই সম্পত্তিটির ম্যাপিং করতে আমি কীভাবে স্বয়ংচালককে এড়াতে পারি?


7
অটোম্যাপারটি সেভাবে কাজ করে না। এটি কেবল গন্তব্য অবজেক্টে সম্পত্তি সম্পর্কে উদ্বিগ্ন। এসআরসি-তে 100 টি অতিরিক্ত বৈশিষ্ট্য থাকতে পারে - অটোম্যাপারগুলি কেবল গন্তব্যের বৈশিষ্ট্যগুলিকে মানচিত্র করে। ম্যাপিংয়ের ব্যতিক্রম ঘটানোর জন্য অবশ্যই অন্য কিছু থাকতে হবে। আপনি কি কাজ করছেন না তার কিছু কোড পোস্ট করতে পারেন?
প্যাট্রিকসটিল

আপনি স্বয়ংক্রিয়ভাবে যা চান তা এটি করে। স্পষ্ট করতে কিছু কোড পোস্ট করুন
BeRecursive

নিম্নলিখিত পোস্টগুলি দেখুন, এগুলি আপনাকে স্ট্যাকওভারফ্লো / প্রশ্নগুলি
ডিবি

3
@ পেট্রিক অটোম্যাপার পদ্ধতি / সম্পত্তির নাম বিশ্লেষণ করে কিছু কৌশল করে। এটা সম্ভব যে উত্সটিতে এমন কোনও সম্পত্তি রয়েছে যা গন্তব্যে কোনও সঠিক মিল না থাকলেও অনিচ্ছাকৃতভাবে ম্যাপ করা হচ্ছে। এই কারণেই যখন এটি ঘটে তখন এটি প্রতিরোধের জন্য একটি ফোর্সোর্সেম্বার (... উপেক্ষা করুন ()) রয়েছে।
অ্যারোনএলএস

উত্তর:


477

জিমি বোগার্ড থেকে: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());

এটি তার ব্লগের একটি মন্তব্যে রয়েছে


13
এছাড়াও, CreateMap<Foo, Bar>().ForSourceMember(x => x.Blarg, opt => opt.Ignore());দরকারী হতে পারে
stackoverfloweth

5
@ স্ট্যাকওভারফ্লোথ আপনার অর্থ নেই : CreateMap<SourceType, DestType> (MemberList.Source).ForSourceMember(x => x.MySourceProperty, opt => opt.DoNotValidate())?
মন্টি

12
ফোরসোর্স মেম্বারে ডনটভালিডেটের সাথে উপেক্ষা করে প্রতিস্থাপন করা হয়েছে: github.com/AutoMapper/
জেমি

@ জ্যামি @ মন্টি - আমি এই পুনরায় আপডেট করতে শুরু করেছি: আপনার মন্তব্য, তবে দেখে মনে হচ্ছে সিনট্যাক্স পরিবর্তন কেবল প্রজেকশন কেসে প্রভাবিত করে (যেখানে উত্সের সম্পত্তিটিকে উপেক্ষা করা দরকার)। ওপি-র অনুরোধটি একটি গন্তব্য সম্পত্তিটিকে অগ্রাহ্য করার অনুরোধ, তাই Ignore()সঠিক বাক্য বাক্য বাকী রইল। এর কারণ হল জন্য সিনট্যাক্স পরিবর্তন Ignoreউপর তৈরি করা হয়েছিল ISourceMemberConfigurationExpressionইন্টারফেস কিন্তু অসংলগ্ন করা না IMemberConfigurationExpression`3ইন্টারফেস।
স্মার্টকাভম্যান

2
@ ফ্রানভা ফরমেম্বার () আসলে "ফোরডেস্টেশন মেম্বার ()"
rvnlord

243

আমি সম্ভবত কিছুটা পারফেকশনিস্ট; আমি ফর্ম মেম্বার (..., 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, তবে আমি লম্বা লম্বা লম্বা পদ্ধতির চেহারা পছন্দ করি না।


6
আমি জানি এটি প্রাথমিক প্রশ্নের অতিক্রম করে চলেছে তবে আমি সত্যিই এই উত্তরটি পছন্দ করি, এটি পরিষ্কার, খুব সহজেই পড়া সহজ এবং তাত্ক্ষণিকভাবে বুঝতে সহজতর পুনরায় ব্যবহার করা সহজ
Lski

সম্পর্কিত params: আপনি একটি ল্যাম্বডারের অভ্যন্তর থেকে নির্বাচকদের একটি অ্যারে ফিরে আসতে পারেন, তারপরে প্রতিটি নির্বাচককে ম্যাপ করুন foreachবা Select()সম্ভবত কম অগোছালো দেখাচ্ছে না, যদিও।
jpaugh

ধন্যবাদ @ স্টিভ রুকুটস, যে কেউ উত্স সদস্যদের উপেক্ষা করার জন্য এক্সটেনশন পদ্ধতির সন্ধান করছেন তার জন্য আপনি এই সর্বজনীন স্থিতি IMappingExpression <টিসোর্স, টিস্টেস্টেশন> উপেক্ষা করুন <টিসোর্স, টিস্টেস্টেশন> (এই ইমপ্যাংএক্সগ্রেশন <টিসোর্স, টিস্টেস্টেশন> মানচিত্র, এক্সপ্রেশন <টিউনসোর্স , অবজেক্ট >> নির্বাচনকারী) {মানচিত্র.ফোর্সোর্স মেম্বার (নির্বাচক, কনফিগারেশন => কনফিগারেশন.ডননটভালিডেট ()); প্রত্যাবর্তন মানচিত্র; }
জেসন ডায়াস

79

তুমি এটি করতে পারো:

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.Ignore());

অটোম্যাপারের কি ফোর্সোর্সেম্বার এক্সটেনশন রয়েছে?
Redeemed1

আমি বর্তমানে এটি করছি, তবে এই সমস্ত উপেক্ষা করা না তৈরি করা আদর্শ হবে ...: /
টম স্টিকেল

আপনি কী জানেন যে ম্যাপিংটি করার সময় এবং যখন মানচিত্র তৈরি করার সময় নয় আসলে উপেক্ষা করার কোনও উপায় আছে?
স্যাম আমি বলছি পুনরায় ইনস্টল করুন মনিকা

অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/4052579/...
Shog9

3
প্রশ্নে দেওয়া দৃশ্যের জন্য, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বর্তমান গৃহীত উত্তর গন্তব্য অবজেক্টে বৈশিষ্ট্যের মানচিত্র উপেক্ষা করে। এই প্রশ্নটি উত্স অবজেক্টে ম্যাপিং উপেক্ষা করার বিষয়ে জিজ্ঞাসা করছে।
রব এস 15

28

যে কেউ স্বয়ংক্রিয়ভাবে এটি করার চেষ্টা করছে তার জন্য, আপনি গন্তব্য প্রকারে বিদ্যমান বিদ্যমান বৈশিষ্ট্যগুলি উপেক্ষা করার জন্য সেই সম্প্রসারণ পদ্ধতিটি ব্যবহার করতে পারেন:

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://canncyr.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/


3
অবগতির জন্য: থেকে মার্জ করা হয়েছে stackoverflow.com/questions/4052579/...
Shog9

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

আমি ঠিক পেয়েছি 'Mapper' does not contain a definition for 'GetAllTypeMaps' [DSSTools]..
বাসি

2
@ বাসি ব্যবহারের Mapper.Configuration.GetAllTypeMaps() উত্স
মাইক

28

এখন একটি IgnoreMapঅ্যাট্রিবিউট (অটোম্যাপার ২.০) রয়েছে , যা আমি সাবলীল সিনট্যাক্সের চেয়ে কিছুটা ভারী আইএমএইচওর পরিবর্তে ব্যবহার করতে যাচ্ছি।


35
আপনার এপ্লিকেশনটির মাধ্যমে অ্যাট্রিবিউট অ্যাট্রিবিউট লিক করে অটো ম্যাপার যদিও।
ফিল করুন

11
অটোম্যাপার হ'ল একটি জিনিস যা আমি পুরো জায়গা জুড়ে ফাঁস করতে পছন্দ করি না। ;)
পাভেল ক্রাকওইয়াক

4
আপনি সর্বদা আহরণ বিবেচনা করতে পারেন IgnoreMapAttribute
আলাপাগো

1
অনেকগুলি অবজেক্টের উত্তরাধিকার সূত্রে প্রাপ্ত কোনও বেস সম্পত্তিটিকে উপেক্ষা করার এটি একটি ভাল উপায়। প্রতিটি ম্যাপিং কনফিগারেশনে এটিকে উপেক্ষা করা থেকে বাঁচায়।
চেজ ফ্লোরেল

23

কোনও ডোমেন মডেলটিতে কোনও ভিউ মডেলকে ম্যাপিংয়ের সময়, গন্তব্য সদস্যের তালিকার পরিবর্তে উত্স সদস্যের তালিকাটি বৈধ করে তোলা আরও পরিষ্কার হতে পারে

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

এখন আমার ম্যাপিংয়ের বৈধতাটি ব্যর্থ হয় না, অন্যটির প্রয়োজন হয় Ignore(), প্রতিবারই আমি আমার ডোমেন শ্রেণিতে কোনও সম্পত্তি যুক্ত করি।


7
এটিই আমি সন্ধান করতে এসেছি, যখন কেবলমাত্র একটি সাধারণ ডিটিও থেকে ডোমেন অবজেক্ট বৈশিষ্ট্যের একটি উপসেটটি পরিবর্তন করা হয়।
অ্যাডাম টলি 3'15

5
এই উত্তর বাচ্চারা, অফিসিয়াল করুন যাতে newbies বিভ্রান্ত হবে না
পিওটার এম


-5

হ্যালো অল দয়া করে এটি ভালভাবে ব্যবহার করুন ... অটো ম্যাপার একাধিক ব্যবহারের জন্য । সি # তে মেম্বার করুন

        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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.