仅当destination属性不为null时才使用UseDestinationValue

cry*_*yss 6 .net c# automapper

当我想使用UseDestinationValue方法中的行为时,如何配置AutoMapper映射,但仅当目标属性为NOT时才配置AutoMapper映射null.

像这样的东西:

Mapper.CreateMap<Item, ItemViewModel>()
    .ForMember(x => x.Details, _ => _.UseDestinationValue(dontUseWhenNullDestination: true))
Run Code Online (Sandbox Code Playgroud)

编辑

class ItemDetails {
    public string Info { get; set; }
    public string ImportantData { get; set; } // only in Domain, not in ViewModel
}

class Item {
    public ItemDetails Details { get; set; }
}

class ItemDetailsViewModel {
    public string Info { get; set; }
}

class ItemViewModel {
    public ItemDetailsViewModel Details { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在使用的例子.我有一个ItemViewModel班级,我想把它映射到Item班级.

映射配置:

    Mapper.CreateMap<Item, ItemViewModel>()
        .ForMember(x => x.Details, _ => _.UseDestinationValue())
Run Code Online (Sandbox Code Playgroud)
  1. 第一种情况 - 目标属性Item.Details属性为NOT NULL.现在我希望AutoMapper 使用此目标Details属性实例,因为它不是null.

    逻辑看起来像这样:

    var item = new Item { 
        Details = new Details {
            Info = "Old text",
            ImportantData = "Data"
        }
    };
    
    var itemViewModel = new ItemViewModel { 
        Details = new DetailsViewModel {
            Info = "New text"
        }
    };       
    
    Mapper.Map(itemViewModel, item);
    
    Run Code Online (Sandbox Code Playgroud)

    由于存在,AutoMapper UseDestinationValue将保留item.Details实例并仅设置item.Details.Info属性.

  2. 第二种情况 - 目标属性Item.Details属性为NULL.现在我希望AutoMapper 不要使用这个null实例,而是创建一个新实例.问题是如何配置映射以考虑这种情况?

    逻辑看起来像这样:

    var item = new Item { 
        Details = null
    };
    
    var itemViewModel = new ItemViewModel { 
        Details = new DetailsViewModel {
            Info = "New text"
        }
    };
    
    Mapper.Map(itemViewModel, item);
    
    Run Code Online (Sandbox Code Playgroud)

    问题

    这里我有一个问题,因为在映射之后,item.Details属性将为null(因为在这种情况下使用UseDestinationValuenull).

原因

从数据库中获取实体后,NHibernate将其放入代理中.所以Details加载对象的属性不是类型:ItemDetails,但是ItemDetailsNHibernateProxy- 所以当我想稍后将这个现有对象保存到数据库时,我必须使用这种类型.但是如果这个属性是null,那么我不能使用null目标值,因此Automapper应该创建一个新实例.

谢谢,克里斯

Pat*_*ele 0

我认为这个NullSubstitute选项适合你。请参阅:http ://weblogs.asp.net/psteele/archive/2011/03/18/automapper-handling-null-members.aspx

编辑

看起来您可能需要在详细信息映射中添加一些条件逻辑(并跳过该UseDestinationValue选项):

.ForMember(d => d.Details, 
    o => o.MapFrom(s => s.Details == null ? new ItemDetails() : Mapper.Map<ItemDetailsViewModel, ItemDetails>(s.Details))
Run Code Online (Sandbox Code Playgroud)

  • 当源值为空时,NullSubstitute 很有用。 (2认同)