Automapper not ignoring nested property

吃可爱长大的小学妹 提交于 2019-12-07 12:29:57

问题


I've had a look through the various similar posts but can't spot the error of my ways with this one. Basically I have two views which update different parts of a "Settings" object. The view models contain one of two properties and depending on which is being set, should ignore the other. It works fine when it's ViewModel ==> Entity direct but when Automapper tries to update the nested object it fails.

I have the following object structure:

public class Account
{
    public int AccountId { get; set; }
    public DateTime DateToBeIgnored { get; set; }
    public AccountSetting Settings { get; set; }
}

public class AccountSetting
{
    public string PropertyOne { get; set; }
    public string PropertyTwo { get; set; }
}

public class AccountViewModel
{
    public int AccountId { get; set; }
    public DateTime DateToBeIgnored { get; set; }
    public AccountSettingViewModel Settings { get; set; }
}

public class AccountSettingViewModel
{
    public string PropertyTwo { get; set; }
}

public class OtherAccountSettingViewModel
{
    public string PropertyOne { get; set; }
}

With the mappings:

void WireUpMappings()
{
    // From the entities to the view models
    Mapper.CreateMap<Account, AccountViewModel>();
    Mapper.CreateMap<AccountSetting, AccountSettingViewModel>();
    Mapper.CreateMap<AccountSetting, OtherAccountSettingViewModel>();

    // From the view models to the entities
    Mapper.CreateMap<AccountViewModel, Account>()
        .ForMember(dest => dest.DateToBeIgnored, opt => opt.Ignore());

    Mapper.CreateMap<AccountSettingViewModel, AccountSetting>()
        .ForMember(dest => dest.PropertyTwo, opt => opt.Ignore());

    Mapper.CreateMap<OtherAccountSettingViewModel, AccountSetting>()
        .ForMember(dest => dest.PropertyOne, opt => opt.Ignore());

    Mapper.AssertConfigurationIsValid();
}

When mapping [OtherAccountSettingViewModel --> AccountSetting], only the property "PropertyTwo" is assigned (and the original value for "PropertyOne" remains unchanged) -this is what I would expect.

However when mapping [AccountViewModel --> Account] "DateToBeIgnored" is ignored as intended whereas Account.AccountSetting.PropertyTwo's previous value is replaced with "null".

Can anyone spot the error of my ways?


回答1:


Here is the solution:

[TestMethod]
public void TestMethod1()
{
     Mapper.CreateMap<AccountViewModel, Account>()
        .ForMember(dest => dest.DateToBeIgnored, opt => opt.Ignore())
        .ForMember(dest=>dest.Settings, opt=>opt.UseDestinationValue());

    Mapper.CreateMap<AccountSettingViewModel, AccountSetting>()
        .ForMember(dest=>dest.PropertyOne, opt=>opt.Ignore())
        .ForMember(dest => dest.PropertyTwo, opt => opt.MapFrom(a => a.PropertyTwo));

    Mapper.AssertConfigurationIsValid();

    AccountViewModel viewmodel = new AccountViewModel()
    {
        AccountId = 3,
        DateToBeIgnored = DateTime.Now,
        Settings = new AccountSettingViewModel() { PropertyTwo = "AccountSettingViewModelPropTwo" }
    };

    Account account = new Account()
    {
        AccountId = 10,
        DateToBeIgnored = DateTime.Now,
        Settings = new AccountSetting() { PropertyOne = "AccountPropOne", PropertyTwo = "AccountPropTwo" }
    };

    account = Mapper.Map<AccountViewModel, Account>(viewmodel, account);

    Assert.IsNotNull(account);

}



来源:https://stackoverflow.com/questions/12439132/automapper-not-ignoring-nested-property

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!