ओटोमैपर लापता प्रकार का मानचित्र विन्यास या असमर्थित मैपिंग - त्रुटि


86

इकाई मॉडल

public partial class Categoies
{
    public Categoies()
    {
        this.Posts = new HashSet<Posts>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Nullable<int> PositionId { get; set; }

    public virtual CategoryPositions CategoryPositions { get; set; }
    public virtual ICollection<Posts> Posts { get; set; }
}

मॉडल देखें

public class CategoriesViewModel
{
    public int Id { get; set; }

    [Required(ErrorMessage = "{0} alanı boş bırakılmamalıdır!")]
    [Display(Name = "Kategori Adı")]
    public string Name { get; set; }

    [Display(Name = "Kategori Açıklama")]
    public string Description { get; set; }

    [Display(Name = "Kategori Pozisyon")]
    [Required(ErrorMessage="{0} alanı boş bırakılmamalıdır!")]
    public int PositionId { get; set; }
}

CreateMap

Mapper.CreateMap<CategoriesViewModel, Categoies>()
            .ForMember(c => c.CategoryPositions, option => option.Ignore())
            .ForMember(c => c.Posts, option => option.Ignore());

नक्शा

[HttpPost]
public ActionResult _EditCategory(CategoriesViewModel viewModel)
{
    using (NewsCMSEntities entity = new NewsCMSEntities())
    {
        if (ModelState.IsValid)
        {
            try
            {
                category = entity.Categoies.Find(viewModel.Id);
                AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
                //category = AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel);
                //AutoMapper.Mapper.Map(viewModel, category);
                entity.SaveChanges();

                // Veritabanı işlemleri başarılı ise yönlendirilecek sayfayı 
                // belirleyip ajax-post-success fonksiyonuna gönder.
                return Json(new { url = Url.Action("Index") });
            }
            catch (Exception ex)
            {

            }
        }

        // Veritabanı işlemleri başarısız ise modeli tekrar gönder.
        ViewBag.Positions = new SelectList(entity.CategoryPositions.ToList(), "Id", "Name");
        return PartialView(viewModel);
    }
}

त्रुटि

गुम प्रकार मानचित्र कॉन्फ़िगरेशन या असमर्थित मैपिंग। मानचित्रण के प्रकार: श्रेणियाँदृश्यमॉडल -> श्रेणीबद्ध_7314E98C41152985A4218174DDF658046BC82AB0ED9E1F0440514D79052F84D News.MS.A.D.A.min.odels.Categories.Category.fe.D.D.E..D.

गंतव्य पथ: श्रेणी_7314E98C41152985A4218174DDF658046BC82AB0ED9E1F0440514D79052F84D

स्रोत मूल्य: NewsCMS.Areas.Admin.Models.CategoriesViewModel

मैं क्या खो रहा हूँ? मैं खोजने की कोशिश करता हूं, लेकिन मुझे समस्या नहीं दिखती।

अपडेट करें

मैंने Global.asax में application_start में निर्दिष्ट किया है

protected void Application_Start()
{
    InitializeAutoMapper.Initialize();
}

प्रारंभ करें

public static class InitializeAutoMapper
{
    public static void Initialize()
    {
        CreateModelsToViewModels();
        CreateViewModelsToModels();
    }

    private static void CreateModelsToViewModels()
    {
        Mapper.CreateMap<Categoies, CategoriesViewModel>();
    }

    private static void CreateViewModelsToModels()
    {
        Mapper.CreateMap<CategoriesViewModel, Categoies>()
            .ForMember(c => c.CategoryPositions, option => option.Ignore())
            .ForMember(c => c.Posts, option => option.Ignore());
    }
}

यह भी जांचें कि क्या आपके पास अलग-अलग नामस्थानों में एक ही वर्ग का नाम है। इसलिए एक मौका है कि आप अलग-अलग ऑब्जेक्ट को इनिशियलाइज़ कर रहे हैं और अलग-अलग ऑब्जेक्ट को मैप और मैप कर रहे हैं
इमान

जवाबों:


66

आपने मैपिंग कोड (CreateMap) कहां निर्दिष्ट किया है? संदर्भ: मैं AutoMapper को कहां कॉन्फ़िगर करूं?

यदि आप स्थैतिक मैपर विधि का उपयोग कर रहे हैं, तो विन्यास केवल एक बार AppDomain के अनुसार होना चाहिए। इसका मतलब है कि कॉन्फ़िगरेशन कोड डालने के लिए सबसे अच्छी जगह एप्लिकेशन स्टार्टअप में है, जैसे ASP.NET अनुप्रयोगों के लिए Global.asax फ़ाइल।

यदि मानचित्र विधि को कॉल करने से पहले कॉन्फ़िगरेशन पंजीकृत नहीं है, तो आप प्राप्त करेंगे Missing type map configuration or unsupported mapping.


2
हाँ आपको अपना वर्ग Mapper.CreateMap <IDataReader, UserBo> () पंजीकृत करना होगा;
निक्की

35

आपकी कक्षा AutoMapperप्रोफ़ाइल में, आपको अपनी इकाई और व्यूमॉडल के लिए एक मानचित्र बनाने की आवश्यकता है।

डोमेन मॉडल मैपिंग के लिए ViewModel:

यह आमतौर पर है AutoMapper/DomainToViewModelMappingProfile

में Configure(), एक लाइन की तरह जोड़ें

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

डोमेन मॉडल ViewModel मैपिंग के लिए:

में ViewModelToDomainMappingProfile, जोड़ें:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

उदाहरण देते हैं


1
धन्यवाद :) मैं सो रहा था और सोचा था कि यह दोनों तरीके से काम करेगा, और वास्तव में यह महसूस नहीं किया कि आदेश देना महत्वपूर्ण था। प्रोफाइल.क्रिएटेप <TSource, TDestination> ()
किकसेन

4
@Kiksen Mapper.CreateMap<YourEntityViewModel, YourEntity>().ReverseMap(); .ReverseMap () यह दोनों तरीकों से काम करेगा और आपको उस मामले में आदेश के बारे में चिंता करने की ज़रूरत नहीं है।
प्रमिल गावंडे

20

Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84Dअपवाद में वर्ग को नोटिस करें ? यह एक एंटिटी फ्रेमवर्क प्रॉक्सी है। मैं आपको यह सुनिश्चित करने के लिए आपके ईएफ संदर्भ का निपटान करने की सलाह दूंगा कि आपकी सभी वस्तुएं डेटाबेस से उत्सुकता से भरी हुई हैं और ऐसी कोई भी संभावना नहीं है:

[HttpPost]
public ActionResult _EditCategory(CategoriesViewModel viewModel)
{
    Categoies category = null;
    using (var ctx = new MyentityFrameworkContext())
    {
        category = ctx.Categoies.Find(viewModel.Id);
    }
    AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
    //category = AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
    entity.SaveChanges();
}

यदि इकाई पुनर्प्राप्ति डेटा एक्सेस लेयर के अंदर की जाती है (जो निश्चित रूप से सही तरीका है) तो सुनिश्चित करें कि आप अपने DAL से इंस्टेंसेस वापस करने से पहले अपने EF संदर्भ का निपटान करें।


क्या यह स्वचालित रूप से किया जाता है, या क्या हमें आटोमैपर को यह बताने की आवश्यकता है कि उसे मैप करने के लिए क्या है (जो कुछ भी है लेकिन ऑटो है)?
brumScouse

1
आपको मैपिंग कॉन्फ़िगर करने की आवश्यकता है। और उन लोगों के लिए जिन्हें आप कस्टम मैपिंग नियम चाहते हैं, उन नियमों को लिखें।
डारिन दिमित्रोव

धन्यवाद। मैं पूरी तरह से ऑटोमैपर पर सेक्शन पर पहुंच गया था कि कैसे..सोमो।
BrumScouse

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

7

मैंने त्रुटि को दूर करने के लिए ऐसा किया:

Mapper.CreateMap<FacebookUser, ProspectModel>();
prospect = Mapper.Map(prospectFromDb, prospect);

5

मुझे समाधान मिल गया, उत्तर के लिए धन्यवाद।

category = (Categoies)AutoMapper.Mapper.Map(viewModel, category, typeof(CategoriesViewModel), typeof(Categoies));

लेकिन, मैं पहले से ही कारण पता नहीं है। मैं पूरी तरह से समझ नहीं सकता।


क्या आपको समस्या का कारण मिला?
शनि टेक्नोलॉजीज

16
शायद यह है कि टाइपो "श्रेणी"
जो फिलिप्स


3

मैं .Net कोर में एक ही मुद्दा था। क्योंकि मेरा आधार dto क्लास (i इसे ऑटोमैपर असेंबली के लिए स्टार्टअप में एक प्रकार के रूप में देता है) अलग प्रोजेक्ट में था। ऑटोमैपर ने बेस क्लास प्रोजेक्ट में प्रोफाइल खोजने की कोशिश की। लेकिन मेरा डोटो अलग प्रोजेक्ट में था। मैंने अपना बेस क्लास चला लिया। और समस्या हल हो गई। यह कुछ व्यक्तियों के लिए मदद कर सकता है।


2

मुझे पता है कि यह अब तक का एक पुराना सवाल है, लेकिन मुझे उचित समाधान मिल गया था कि मैं विधानसभा विशेषता घोषित नहीं कर रहा था।

मेरा कोड है:

using AutoMapper;
...

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}

यह मेरे नेमस्पेस घोषणा से पहले निम्नलिखित पंक्ति को जोड़कर तय किया गया था:

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

पूर्ण कोड है:

using AutoMapper;
...

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}

1

मेरे मामले में, मैंने मैप बनाया था, लेकिन ReverseMap फ़ंक्शन याद कर रहा था। इसे जोड़ने से त्रुटि से छुटकारा मिला।

      private static void RegisterServices(ContainerBuilder bldr)
      {
         var config = new MapperConfiguration(cfg =>
         {
            cfg.AddProfile(new CampMappingProfile());
         });
         ...
       }


      public CampMappingProfile()
      {
         CreateMap<Talk, TalkModel>().ReverseMap();
         ...
      }

1

मैं एक IEnumerable एक वस्तु को मैप करने की कोशिश कर रहा था। इस तरह से मुझे यह त्रुटि मिली है। शायद यह मदद करता है।


-1

6.2.2 संस्करण के लिए ऑटोमैपर अपग्रेड करें। इसने मेरी मदद की


-1

मैंने एक नया ऑटोमेपरप्रोफ़ाइल क्लास बनाया। यह प्रोफ़ाइल का विस्तार करता है। हमारे पास हमारे समाधान में 100 से अधिक परियोजनाएं हैं। कई परियोजनाओं में एक ऑटोमैपरप्रोफ़ाइल वर्ग है, लेकिन यह इस मौजूदा परियोजना के लिए नया था। हालाँकि, मैंने पाया कि मुझे इस मुद्दे को ठीक करने के लिए क्या करना था। एक बंधन परियोजना है। प्रारंभ के भीतर यह कोड है:

var mappingConfig = new List<Action<IConfiguration>>();

// Initialize the Automapper Configuration for all Known Assemblies
mappingConfig.AddRange( new List<Action<IConfiguration>>
{
   ConfigureProfilesInAssemblyOfType<Application.Administration.AutomapperProfile>,
   //...

मुझे ConfigureProfilesInAssemblyOfType < MyNewNamespace .AutomapperProfile> जोड़ना था।

ध्यान दें कि ConfigureProfilesInAssemblyOfType इस तरह दिखता है:

    private static void ConfigureProfilesInAssemblyOfType<T>( IConfiguration configuration )
    {
        var log = LogProvider.Get( typeof (AutomapperConfiguration) );

        // The Automapper Profile Type
        var automapperProfileType = typeof (Profile);

        // The Assembly containing the type
        var assembly = typeof (T).Assembly;
        log.Debug( "Scanning " + assembly.FullName );

        // Configure any Profile classes found in the assembly containing the type.
        assembly.GetTypes()
            .Where( automapperProfileType.IsAssignableFrom ).ToList()
            .ForEach( x =>
            {
                log.Debug( "Adding Profile '" + x.FullName + "'" );
                configuration.AddProfile( Activator.CreateInstance( x ) as Profile );
            } );
    }

सादर, -जेफ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.