我有以下课程:
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
列表。
我尝试过创建特定于问题的映射(TextQuestion
到TextQuestion
),但是他们没有参与,因为Questions
属性中的对象包含在EF& #39; s DynamicProxy
类。
在Mapper.Map(...)中,我可以做什么,从我的抽象基类Question
类的继承者中排除Id?
答案 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寻找派生最多的类。