Automapper 5.1.1继承映射
Automapper 5.1.1 inheritance mapping
您好,我无法让我的映射适用于继承 class。
想法是只为基对象和接口创建映射一次,当子classes实现自己的成员时,只为那些没有在基class或intrface.[=13中定义的成员配置映射。 =]
让我从示例代码开始。
public class DtoClass {
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
public interface IField3 {
public string EntityField3 { get; set; }
}
public class BaseEntityClass {
public string EntityField1 { get; set; }
}
public class ChildEntityClass : BaseEntityClass, IField3 {
public string EntityField2 { get; set; }
public string EntityField3 { get; set; }
}
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1))
.Include<ChildEntityClass, DtoClass>();
CreateMap<IField3, DtoClass>()
.ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3));
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2));
附加代码当然不起作用。打电话时:
AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);
我只得到在 CreateMap<ChildEntityClass, DtoClass>().
中定义的映射成员
知道如何只为基础 class 和接口实现一次映射吗?
是的,我想将所有类型的 ChildEntityClass、BaseEntityClass 和 IField3 映射到 DtoClass。
欢迎任何关于优雅配置此类映射的提示。
编辑:为了清楚起见,我从子class中删除了不必要的 Incssary IncludeBase,但是none
- subclass 中的 IncludeBase
- 包含在基础中 class
为我工作。什么会导致此类问题?
您不应该使用 .IncludeBase
和 .Include
- 选择一个并坚持使用。我更喜欢 .IncludeBase
,因为我认为在子类中定义更有意义。在您的情况下,您不能使用 Include 引用 IField3,因为没有隐式转换。
以下代码对我来说使用 IncludeBase
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1))
;
CreateMap<IField3, DtoClass>()
.ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3))
;
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2))
.IncludeBase<BaseEntityClass, DtoClass>()
.IncludeBase<IField3, DtoClass>()
;
因为问题经常发生在我在示例代码中提供的范围之外。
在我的项目中,初始化方法中隐藏了类似以下内容的调用:
foreach (string propName in map.GetUnmappedPropertyNames())
{
expr.ForMember(propName, opt => opt.Ignore());
}
因此,即使在为基类型调用映射时,所有未映射到子类中的列也会被自动忽略。简单但有问题。
上面的代码可能是为了Mapper.Configuration.AssertConfigurationIsValid();
通过而添加的。
您好,我无法让我的映射适用于继承 class。 想法是只为基对象和接口创建映射一次,当子classes实现自己的成员时,只为那些没有在基class或intrface.[=13中定义的成员配置映射。 =]
让我从示例代码开始。
public class DtoClass {
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
public interface IField3 {
public string EntityField3 { get; set; }
}
public class BaseEntityClass {
public string EntityField1 { get; set; }
}
public class ChildEntityClass : BaseEntityClass, IField3 {
public string EntityField2 { get; set; }
public string EntityField3 { get; set; }
}
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1))
.Include<ChildEntityClass, DtoClass>();
CreateMap<IField3, DtoClass>()
.ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3));
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2));
附加代码当然不起作用。打电话时:
AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);
我只得到在 CreateMap<ChildEntityClass, DtoClass>().
知道如何只为基础 class 和接口实现一次映射吗? 是的,我想将所有类型的 ChildEntityClass、BaseEntityClass 和 IField3 映射到 DtoClass。
欢迎任何关于优雅配置此类映射的提示。
编辑:为了清楚起见,我从子class中删除了不必要的 Incssary IncludeBase,但是none
- subclass 中的 IncludeBase
- 包含在基础中 class
为我工作。什么会导致此类问题?
您不应该使用 .IncludeBase
和 .Include
- 选择一个并坚持使用。我更喜欢 .IncludeBase
,因为我认为在子类中定义更有意义。在您的情况下,您不能使用 Include 引用 IField3,因为没有隐式转换。
以下代码对我来说使用 IncludeBase
CreateMap<BaseEntityClass, DtoClass>()
.ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1))
;
CreateMap<IField3, DtoClass>()
.ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3))
;
CreateMap<ChildEntityClass, DtoClass>()
.ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2))
.IncludeBase<BaseEntityClass, DtoClass>()
.IncludeBase<IField3, DtoClass>()
;
因为问题经常发生在我在示例代码中提供的范围之外。
在我的项目中,初始化方法中隐藏了类似以下内容的调用:
foreach (string propName in map.GetUnmappedPropertyNames())
{
expr.ForMember(propName, opt => opt.Ignore());
}
因此,即使在为基类型调用映射时,所有未映射到子类中的列也会被自动忽略。简单但有问题。
上面的代码可能是为了Mapper.Configuration.AssertConfigurationIsValid();
通过而添加的。