[asp.net-mvc] Automapper 유형 맵 구성 누락 또는 지원되지 않는 매핑-오류

엔티티 모델

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



답변

매핑 코드 (CreateMap)를 어디에 지정 했습니까? 참조 : AutoMapper는 어디에서 구성합니까?

정적 매퍼 메서드를 사용하는 경우 구성은 AppDomain 당 한 번만 발생해야합니다. 즉, ASP.NET 응용 프로그램 용 Global.asax 파일과 같은 응용 프로그램 시작시 구성 코드를 입력하는 가장 좋은 위치입니다.

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


답변

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

ViewModel- 도메인 모델 매핑 :

이것은 일반적으로 AutoMapper/DomainToViewModelMappingProfile

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

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

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

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

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

요점 예


답변

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


답변

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

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


답변

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

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

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


답변

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

 AutoMapperConfig.Configure();


답변

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