使用Automapper深度克隆对象,不能排除List <abstractbaseclass>属性

时间:2015-12-09 12:49:32

标签: entity-framework automapper

我有以下课程:

public abstract class Question : IQuestion
{
  [Key]
  public int Id { get; set; }

  // Some other base properties here
}

public class TextQuestion : Question
{
  // Some class-specific properties here
}

这样的课程:

public class SomeCompositeClass
{
  [Key]
  public int Id { get; set; }

  // Some properties go here ...

  public virtual List<Question> Questions { get; set; }
}

我想使用Automapper创建SomeCompositeClass的深层克隆(请不要建议ICloneable),但没有所有ID,因为我会将其插入数据库,我使用EntityFramework,存储库模式访问。

当然,我创建了一个映射:

Mapper.CreateMap<SomeCompositeClass, SomeCompositeClass>().ForMember(rec => rec.Id, opt => opt.Ignore())

这对于SomeCompositeClass非常有用。

但是我在为Questions属性做同样的事情时遇到了问题!问题来自列表中的基类abstract,而不是因为列表本身是virtual,我已经排除了这一点。

如果我创建Mapper.CreateMap<Question, Question>()Mapper.CreateMap<IQuestion, IQuestion>()映射,代码会在运行时抛出异常,抱怨它无法创建抽象(Question)对象的实例。

我尝试了Mapper.CreateMap<List<Question>, List<Question>>(),但这只是在运行时给我一个空的Questions列表。

我尝试过创建特定于问题的映射(TextQuestionTextQuestion),但是他们没有参与,因为Questions属性中的对象包含在EF& #39; s DynamicProxy类。

在Mapper.Map(...)中,我可以做什么,从我的抽象基类Question类的继承者中排除Id?

1 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题:

首先,我更新了Automapper 4.1.1。然后:

http://localhost:8080/... / ... /user/register

它有效......

所以我认为我最缺少的是 Mapper.Initialize(cfg => { cfg.CreateMap<Question, Question>() .Include<TextBoxQuestion, TextBoxQuestion>() // Supposedly inheritance mapping? .ForMember(rec => rec.Id, opt => opt.Ignore()); cfg.CreateMap<TextBoxQuestion, TextBoxQuestion>() // But either I don't understand inheritance mapping or it doesn't work, soI have to do that too .ForMember(rec => rec.Id, opt => opt.Ignore()); cfg.CreateMap<SomeCompositeClass, SomeCompositeClass>() .ForMember(rec => rec.Id, opt => opt.Ignore()) } ... Mapper.Map(source, destination); 部分,它告诉Automapper寻找派生最多的类。