简体   繁体   English

忽略嵌套类的自动映射器中的属性

[英]Ignoring property in automapper for a nested class

I am having an issue where automapper is trying to map a property that I do not want it to map. 我遇到一个问题,即自动映射器试图映射我不希望其映射的属性。 I can fix this issue by renaming the property to something else but I want to use the name and I want to know how to fix issues like this. 我可以通过将属性重命名为其他名称来解决此问题,但是我想使用名称,并且想知道如何解决此类问题。

My code looks like this. 我的代码如下所示。

public abstract class Task
    {
        public int Id { get; set; }
        public int ProjectId { get; set; }
        public virtual Project Project { get; set; }
        public string Title { get; set; }
    }

 public class BasicTask : Task
    {
    }
public abstract class Project
    {

        public virtual int Id { get; set; }
        public virtual string Title { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        [NotMapped]
        public abstract string ProjectTypeDescription { get; }

    }
public class BasicProject : Project
    {
        public override string ProjectTypeDescription
        {
            get { return "Basic Project"; }
        }
    }


public abstract class TaskViewModel
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public abstract string TaskType { get; }
        //This is the property giving me issues
        public ProjectDetails Project { get; set; }

        public class ProjectDetails
        {
            public int Id { get; set; }
            public string Title { get; set; }
        }
    }
public class BasicTaskViewModel : TaskViewModel
    {
        public override string TaskType
        {
            get { return "Basic"; }
        }
    }
public abstract class ProjectViewModel
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public SelectList ProjectTypes { get; set; }
        public abstract string ProjectType { get; }
        public IEnumerable<TaskViewModel> Tasks { get; set; }
    }
public class BasicProjectViewModel : ProjectViewModel
    {
        public override string ProjectType
        {
            get { return "Basic Project"; }
        }
    }

My mapping for Tasks looks like (I removed the project mapping since I can replicate the problem without those mappings) 我对Tasks的映射看起来像(我删除了项目映射,因为我可以在没有那些映射的情况下复制问题)

Mapper.CreateMap<Task, TaskViewModel>()
                .ForMember(dest => dest.Project, opt => opt.Ignore())
                .Include<BasicTask, BasicTaskViewModel>();
            Mapper.CreateMap<BasicTask, BasicTaskViewModel>();

            Mapper.CreateMap<TaskViewModel, Task>()
                .Include<BasicTaskViewModel, BasicTask>();
            Mapper.CreateMap<BasicTaskViewModel, BasicTask>();

            Mapper.CreateMap<Project, TaskViewModel.ProjectDetails>();

I am use an extenstion method for the mapping 我正在使用扩展方法进行映射

public static TResult MapTo<TResult>(this object self)
        {
            return (TResult)Mapper.Map(self, self.GetType(), typeof(TResult));
        }

An example of using this that fails is 使用此失败的示例是

TaskViewModel vm = new BasicTaskViewModel()
            {
                Id = 1,
                Project = new TaskViewModel.ProjectDetails()
                {
                    Id = 1,
                    Title = "Some Title",
                }
            };

            Task m = vm.MapTo<Task>();

Sorry for the very long post I just don't know where the problem is. 很抱歉很长的帖子,我只是不知道问题出在哪里。

If I rename Project in the taskviewmodel to something else it works and doesn't map TaskViewModel.ProjectDetails to Project which is what I want. 如果我将taskviewmodel中的Project重命名为其他名称,则它可以正常工作,并且不会将TaskViewModel.ProjectDetails映射到我想要的Project。

I have tried adding ForSourceMember(src => src.Project, opt => opt.Ignore()) in every spot that I can 我尝试在每个可以添加的ForSourceMember(src => src.Project, opt => opt.Ignore())添加ForSourceMember(src => src.Project, opt => opt.Ignore())

When I run this I get the follwoing 当我运行此程序时,

 Missing type map configuration or unsupported mapping.

Mapping types:
ProjectDetails -> Project
amtest.ViewModel.TaskViewModel+ProjectDetails -> amtest.Models.Project

Destination path:
BasicTask.Project.Project

Source value:
amtest.ViewModel.TaskViewModel+ProjectDetails
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
ProjectDetails -> Project
amtest.ViewModel.TaskViewModel+ProjectDetails -> amtest.Models.Project

Destination path:
BasicTask.Project.Project

Source value:
amtest.ViewModel.TaskViewModel+ProjectDetails

Does it help when you add the ignore also to the mapping of the child class? 将忽略也添加到子类的映射时是否有帮助?

Mapper.CreateMap<BasicTaskViewModel, BasicTask>()
      .ForMember(dest => dest.Project, opt => opt.Ignore());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM