Automapper 유형 맵 구성 누락 또는 지원되지 않는 매핑-오류


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

오류

유형 맵 구성이 누락되었거나 지원되지 않는 매핑입니다. 매핑 유형 : CategoriesViewModel-> Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D NewsCMS.Areas.Admin.Models.CategoriesViewModel-> System.Data.Entity.DynamicProxies.Categoies_7314E98C41152985A421879052F6580985A421879052DF6580

대상 경로 : Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

소스 값 : NewsCMS.Areas.Admin.Models.CategoriesViewModel

내가 무엇을 놓치고 있습니까? 찾으려고하는데 문제가 보이지 않습니다.

최신 정보

Global.asax의 application_start에 지정했습니다.

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

InitializeClass

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 파일과 같은 응용 프로그램 시작시 구성 코드를 입력하는 가장 좋은 위치입니다.

Map 메서드를 호출하기 전에 구성이 등록되지 않은 경우 Missing type map configuration or unsupported mapping.


2
예, 클래스를 등록해야합니다. Mapper.CreateMap <IDataReader, UserBo> ();
Nikki

35

클래스 AutoMapper프로필에서 엔터티 및 뷰 모델에 대한 맵을 만들어야합니다.

ViewModel- 도메인 모델 매핑 :

이것은 일반적으로 AutoMapper/DomainToViewModelMappingProfile

에서 다음 Configure()과 같은 줄을 추가합니다.

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

ViewModel 매핑에 대한 도메인 모델 :

에서 다음 ViewModelToDomainMappingProfile을 추가합니다.

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

요점 예


1
고마워요 :) 나는 자고 있었고 그것이 두 가지 방식으로 작동한다고 생각했고 주문이 중요하다는 것을 실제로 깨닫지 못했습니다. Profile.CreateMap <TSource, TDestination> ()
Kiksen

4
@Kiksen Mapper.CreateMap<YourEntityViewModel, YourEntity>().ReverseMap(); .ReverseMap () 은 두 가지 방식으로 작동 하며이 경우 순서에 대해 걱정할 필요도 없습니다.
Pramil Gawande

20

Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D예외 의 클래스가 보이십니까? 그것은 Entity Framework 프록시입니다. 모든 개체가 데이터베이스에서 열심히로드되고 이러한 프록시가 존재하지 않도록 EF 컨텍스트를 폐기하는 것이 좋습니다.

[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 컨텍스트를 삭제해야합니다.


이 작업이 자동으로 수행됩니까, 아니면 Automapper가 매핑해야 할 사항을 알려야합니까 (자동이 아닌 것)?
brumScouse 2010

1
매핑을 구성해야합니다. 그리고 사용자 지정 매핑 규칙을 원하는 경우 해당 규칙을 작성하십시오.
Darin Dimitrov 2013

감사합니다. 어떻게 든 automapper에 대한 섹션을 완전히 건너 뛰었습니다.
brumScouse 2013

올바른은, 사실 우리가해야 할 가져 오기 및 편집 방법의 게시물에 대한지도를 작성 도메인 모델 뷰 모델 매핑 및 포스트 그것을 위해 : 가져 그것의를 위해, 뷰 모델로 도메인 모델 매핑 확인 , 희망이 사람을 도움이됩니다.
Shaiju T

7

오류를 제거하기 위해 이렇게했습니다.

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

5

해결책을 찾았습니다. 답장 해 주셔서 감사합니다.

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

그러나 나는 이미 그 이유를 모른다. 나는 완전히 이해할 수 없다.


문제의 원인을 찾았습니까?
Saturn Technologies

16
아마 그 오타 "Categoies"의
조 필립스

5

Global.asax.cs 파일을 확인하고이 줄이 있는지 확인하십시오.

 AutoMapperConfig.Configure();

3

.Net Core에서 동일한 문제가 발생했습니다. 내 기본 dto 클래스 (automapper 어셈블리 시작시 유형으로 제공)가 다른 프로젝트에 있었기 때문입니다. Automapper가 기본 클래스 프로젝트에서 프로필을 검색하려고했습니다. 하지만 내 dto는 다른 프로젝트에있었습니다. 기본 수업을 옮겼습니다. 그리고 문제가 해결되었습니다. 이것은 일부 사람들에게 도움이 될 수 있습니다.


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

Automapper를 버전 6.2.2로 업그레이드하십시오. 그것은 나를 도왔다


-1

새로운 AutomapperProfile 클래스를 만들었습니다. 프로필을 확장합니다. 솔루션에는 100 개 이상의 프로젝트가 있습니다. 많은 프로젝트에 AutomapperProfile 클래스가 있지만이 클래스는 기존 프로젝트에 새로 추가되었습니다. 하지만이 문제를 해결하기 위해해야 ​​할 일을 찾았습니다. 바인딩 프로젝트가 있습니다. 초기화 내에 다음 코드가 있습니다.

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

감사합니다, -Jeff

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.