使用Automapper映射嵌套类

4
我有一个项目,其中有三个层次的嵌套。大致如下:
    public class Assignment
    {
        public Element Element { get; set; }
    }

    public class Element
    {
        public Subject Subject { get; set; }
    }

    public class Subject
    {
        public int? Id { get; set; }

        public string Subject_Title { get; set; }
    }

每个类中都有许多其他属性。数据库遵循相同的结构。现在我想将数据库中的assignment映射到视图模型。

我使用automapper编写的映射第一次可以工作,但之后就不行了。因此,在后续运行中,Subject的值为空,而Element的值在所有运行中都是正常的。问题只出在主题上。

有人能指点我正确的方向并告诉我我做错了什么吗?

        Mapper.CreateMap<db_Subject, Subject>();

        Mapper.CreateMap<db_element, Element>()
              .ForMember(dest => dest.Subject, opt => opt.MapFrom(src => src.db_Subject));

        Mapper.CreateMap<db_assignment, Assignment>()
              .ForMember(dest => dest.Element, opt => opt.MapFrom(src => src.db_element));

简单来说,db_subjectdb_element 中的外键,同样地,db_elementdb_assignment 中的外键。在视图模型中,某些情况下列名可能会有所不同。


请追踪以下网址以了解关于程序开发的相关内容:https://dev59.com/4mrXa4cB1Zd3GeqPCLuT#13338523 或者 http://stackoverflow.com/questions/13348812/how-to-use-automapper-to-create-complex-viewmodel-objects-from-a-simple-object-a/13355873#13355873 - Prasad Kanaparthi
@Prasad,还是不行,问题在于上面的代码第一次运行正常,之后就停止工作了。你能否在这里发布一些代码以获取更多信息。 - Garima
你能否发布使用这些Mappings的代码部分?另外,哪一个是你的视图模型?请在此处发布所有相关类。 - jpgrassi
假设所有属性名称都相同,从源对象映射到目标对象,您只需要映射子对象sourceChild -> destinationChild和sourceGrandChild -> destinationGrandChild,Automapper应该处理其余部分。 - Dave Alperovich
同意@DaveAlperovich,但不知何故它没有起作用。我放置了Mapper.Reset(),然后它开始工作了,但仍然不确定问题出在哪里! - Garima
显示剩余3条评论
1个回答

1

请尝试以下内容:

我假设您的数据库类如下所示。

public class DB_Assignment
{
    public DB_Element Db_Element { get; set; }
}

public class DB_Element
{
    public DB_Subject Db_Subject { get; set; }
}

public class DB_Subject
{
    public int? Db_Id { get; set; }
    public string Db_Subject_Title { get; set; }
}

然后创建以下这样的映射。
Mapper.CreateMap<DB_Subject, Subject>()
    .ForMember(destination => destination.Id, options => options.MapFrom(source => source.Db_Id))
    .ForMember(destination => destination.Subject_Title, options => options.MapFrom(source => source.Db_Subject_Title))
    .ReverseMap();

Mapper.CreateMap<DB_Element, Element>()
    .ForMember(destination => destination.Subject, options => options.MapFrom(source => source.Db_Subject))
    .ReverseMap();

Mapper.CreateMap<DB_Assignment, Assignment>()
    .ForMember(destination => destination.Element, options => options.MapFrom(source => source.Db_Element))
    .ReverseMap();

使用方法如下:
var db_Assignment_1 = new DB_Assignment { Db_Element = new DB_Element { Db_Subject = null } };
var assignment_1 = MappingEngine.Map<DB_Assignment, Assignment>(db_Assignment_1);

var db_Assignment_2 = new DB_Assignment { Db_Element = new DB_Element { Db_Subject = new DB_Subject { Db_Id = 1, Db_Subject_Title = "Some title" } } };
var assignment_2 = MappingEngine.Map<DB_Assignment, Assignment>(db_Assignment_2);

var db_Assignment_Lst = new List<DB_Assignment> { db_Assignment_1, db_Assignment_2 };
var assignment_Lst = MappingEngine.Map<List<DB_Assignment>, List<Assignment>>(db_Assignment_Lst);

对我来说运行良好。


感谢@Prasad提供的代码,但问题仍然存在。它在第一次运行时可以工作,但之后就停止了。我尝试在映射之前使用Mapper.Reset(),然后它开始工作了。我还不确定问题出在哪里。 - Garima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接