【问题标题】:Automapper 5.1.1 inheritance mappingAutomapper 5.1.1 继承映射
【发布时间】:2017-03-13 16:35:08
【问题描述】:

您好,我无法让我的映射适用于继承的类。 想法是只为基对象和接口创建一次映射,当子类实现自己的成员时,只为那些未在基类或接口中定义的成员配置映射。

让我从示例代码开始。

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&lt;ChildEntityClass, DtoClass&gt;().中定义的映射成员

知道如何只为基类和接口实现一次映射吗? 是的,我想将所有类型 ChildEntityClass、BaseEntityClass 和 IField3 映射到 DtoClass。

欢迎任何关于优雅配置的提示。

编辑:为了清楚起见,我从子类中删除了不必要的 IncludeBase,但两者都没有
- 子类中的 IncludeBase - 包含在基类中 为我工作。什么会导致这些问题?

【问题讨论】:

    标签: c# inheritance automapper automapper-5


    【解决方案1】:

    您不应该使用.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>()
        ;
    

    【讨论】:

    • 不,它仍然不起作用,只调用配置为最后一个的映射,没有那些来自基类的映射。包括在基类中都不适合我。另一个问题是什么 aout interface ?为了清楚起见,我在示例代码中删除了 IncludeBase。
    • 确保使用 Mapper.AssertConfigurationIsValid() 测试您的配置文件。这可能会指出导致问题的原因。
    • 使用 IncludeBase 更新了我的答案,使用您的示例代码对我有用。
    【解决方案2】:

    因为它经常发生的问题超出了我在示例代码中提供的范围。

    在我的项目中,初始化方法中隐藏了类似的调用:

            foreach (string propName in map.GetUnmappedPropertyNames())
            {
                expr.ForMember(propName, opt => opt.Ignore());
            }
    

    因此,即使在为基类型调用映射时,所有未映射到子类中的列也会被自动忽略。简单但有问题。

    上面这样的代码可能是为了让Mapper.Configuration.AssertConfigurationIsValid();通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多