繁体   English   中英

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

[英]Ignoring property in automapper for a nested class

我遇到一个问题,即自动映射器试图映射我不希望其映射的属性。 我可以通过将属性重命名为其他名称来解决此问题,但是我想使用名称,并且想知道如何解决此类问题。

我的代码如下所示。

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

我对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>();

我正在使用扩展方法进行映射

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

使用此失败的示例是

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

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

很抱歉很长的帖子,我只是不知道问题出在哪里。

如果我将taskviewmodel中的Project重命名为其他名称,则它可以正常工作,并且不会将TaskViewModel.ProjectDetails映射到我想要的Project。

我尝试在每个可以添加的ForSourceMember(src => src.Project, opt => opt.Ignore())添加ForSourceMember(src => src.Project, opt => opt.Ignore())

当我运行此程序时,

 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

将忽略也添加到子类的映射时是否有帮助?

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