如何使用ExpressMapper

时间:2019-03-13 18:33:36

标签: c# entity-framework-6 express-mapper

我正在开发一个Web应用程序(首先是EF6代码),使用户能够填写评估。评估包含多个问题,一个问题包含多个子问题。 每个子问题都有一个“映射功能”,使用户可以将一个子问题与另一个现有子问题相关联。

我有以下实体框架模型(我删除了一些属性,因为在我的示例中不需要它们)

public class Question
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<SubQuestion> SubQuestions { get; set; }
}
public class SubQuestion
{
    public int ID { get; set; }
    public int QuestionID { get; set; }
    public virtual Question Question { get; set; }

    [Required]
    [MaxLength(255)]
    public string Name { get; set; }
    public virtual ICollection<Answer> Answers { get; set; }

    //These 2 properties are used to create a many-to-many table for the mapping of subquestions
    //Automatic name = SubQuestion_ID
    //Subquestion of current evaluation to map to another evaluation
    public virtual ICollection<SubQuestion> SubquestionCurrentMapping { get; set; }

    //Automatic name = SubQuestion_ID1
    //Subquestion of evaluation the current evaluation is mapped to
    public virtual ICollection<SubQuestion> SubquestionPreviousMapping { get; set; }

}

在项目中,我们使用以下DTO对象

public class QuestionVM
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<SubQuestionVM> SubQuestions { get; set; } = new List<SubQuestionVM>();
}

public class SubQuestionVM
{
    public int ID { get; set; }
    public int QuestionID { get; set; }
    public string Name { get; set; }
    public List<AnswerVM> Answers { get; set; }

    public List<SubQuestionVM> SubquestionCurrentMapping { get; set; }
}

我们正在使用ExpressMapper(请参阅http://expressmapper.org)。我们有一种方法可以将所有DTO与EF模型进行映射,如下所示:

public void MappingRegistration()
{
    Mapper.Register<Question, QuestionVM>();
    Mapper.Register<SubQuestion, SubQuestionVM>();
    Mapper.Compile();
}

所有内容都已映射并且可以正常工作,直到我在subquestionVM中添加了以下属性:

public List<SubQuestionVM> SubquestionCurrentMapping { get; set; }

此属性创建一个多对多表,以将子问题链接在一起以实现映射功能。

当我尝试启动应用程序时,出现以下错误:

  

“引发了类型为'System.StackOverflowException'的异常。”


我尝试过的更改是: 在SubquestionVM

//public List<SubQuestionVM> SubquestionCurrentMapping { get; set; }                                                                         
public List<SubQuestionMappedVM> SubquestionCurrentMapping { get; set; } = new List<SubQuestionMappedVM>(); //Trying to fix by changing vm

有我要测试的新VM:

public class SubQuestionMappedVM
{
    public int ID { get; set; }
    public int QuestionID { get; set; }
    public string Name { get; set; }
    //Remove this property, don't need more than 1 level of recursion anyway
    //public List<SubQuestionMappedVM> SubquestionCurrentMapping { get; set; }
    public List<AnswerVM> Answers { get; set; }
}

我还将新的VM添加到执行映射的方法中:

Mapper.Register<SubQuestion, SubQuestionMappedVM>();

我认为我的问题是因为我正在映射一个subquestionVM,其中包含创建递归的subquestionVM列表。我正在尝试创建其他subquestionVM来绕过该问题,但是我的网页甚至没有显示在我的浏览器中。漫长的1分钟45后,Visual Studio响应“任务已取消。”。

如果有人知道如何映射我的递归SubquestionVM,如何使用其他VM来停止递归或任何其他防止堆栈溢出错误的解决方案,我将不胜感激!

1 个答案:

答案 0 :(得分:0)

这是我解决此问题的方法:

我不知道如何使用ExpressMapper或其他视图模型来绕过堆栈溢出异常,因此我创建了一种方法,可以从EF模型到DTO模型进行手动映射。

MakeGenericMethod