Automapper 8 Ignore Attribute не работает на дочернем потомке - PullRequest
0 голосов
/ 28 апреля 2019

Я использую AutoMapper 8.1.0 в основном проекте asp.net.У меня есть сопоставление Automapper, которое не работает, как я ожидал.Я воспроизвел конфигурацию, чтобы вы могли проверить ее самостоятельно.Итак, у меня есть ExpenseReport с коллекцией ExpenseReportItem и этот с другой коллекцией.Я должен сохранить данные eTaxCollection после сопоставления, но они теряются в процессе.

Итак, вопрос в том, почему значения eTaxCollections теряются после вызова _mapper.Map (vmodel, model) и как я могу их сохранить?

Атрибут игнорирования не работает.Я также попробовал UseDestinationValue ().Я потерял 2 дня, пытаясь понять это, и я устал.

    public void WeatherForecasts()
            {
                int[] excludeTaxes = new int[] { 2 };
                var vmodel = new ExpenseReportCreateEditModel();
                vmodel.Expenses.Add(new ExpenseReportItemModel()
                {
                    ExcludeTaxIds = excludeTaxes,
                    Total = 12,
                    Id = 1
                });

                // fetch from bd
                var model = new ExpenseReport();
                // values will be lost after _mapper.Map...
                var eTaxCollections = new HashSet<ExcludeExpenseReportItemTax>();
                eTaxCollections.Add(new ExcludeExpenseReportItemTax()
                {
                    TaxId = 1,
                    ExpenseReportItemId = 1
                });

                model.Items.Add(new ExpenseReportItem()
                {
                    ExcludeTaxes = eTaxCollections,
                    ExpenseReportId = 1,
                    Id = 9
                });

                _mapper.Map(vmodel, model);
            }

public class ExpenseReportCreateEditModelProfile : Profile
        {
            public ExpenseReportCreateEditModelProfile()
            {
                CreateMap<ExpenseReportCreateEditModel, ExpenseReport>()
                    .ForMember(d => d.Items, s => s.MapFrom(m => m.Expenses));
            }
        }

        public class ExpenseReportItemModelProfile : Profile
        {
            public ExpenseReportItemModelProfile()
            {
                CreateMap<ExpenseReportItemModel, ExpenseReportItem>()
                    .ForMember(d => d.ExcludeTaxes, s => s.Ignore()); // <<<==== data are lost
            }
        }
        public class ExpenseReportCreateEditModel
        {
            public int Id { get; set; }
            public ICollection<ExpenseReportItemModel> Expenses { get; set; }
            public ExpenseReportCreateEditModel()
            {
                Expenses = new HashSet<ExpenseReportItemModel>();
            }
        }

        public class ExpenseReportItemModel
        {
            public int Id { get; set; }
            public ICollection<int> ExcludeTaxIds { get; set; }
            public decimal Total { get; set; }

            public ExpenseReportItemModel()
            {
                ExcludeTaxIds = new HashSet<int>();
            }
        }

        public class ExpenseReport
        {
            public int Id { get; set; }
            public virtual ICollection<ExpenseReportItem> Items { get; set; }
            public ExpenseReport()
            {
                Items = new HashSet<ExpenseReportItem>();
            }
        }

        public class ExpenseReportItem 
        {
            public int Id { get; set; }
            public int ExpenseReportId { get; set; }
            public virtual ICollection<ExcludeExpenseReportItemTax> ExcludeTaxes { get; set; }
            public ExpenseReportItem()
            {
                ExcludeTaxes = new HashSet<ExcludeExpenseReportItemTax>();
            }
        }

        public class ExcludeExpenseReportItemTax
        {
            public int ExpenseReportItemId { get; set; }
            public virtual ExpenseReportItem ExpenseReportItem { get; set; }
            public int TaxId { get; set; }
        }

Спасибо за любую помощь

Редактировать


Я выполняю план выполнения, и, возможно, это проблема:

$typeMapDestination = ($dest ?? .New WebApplication1.Controllers.SampleDataController+ExpenseReportItem());

Это единственный способ потерять значения.Я должен найти решение сейчас

Вот полный план выполнения:

.If ($src == null) {
    .Default(WebApplication1.Controllers.SampleDataController+ExpenseReportItem)
} .Else {
    .Block() {
        $typeMapDestination = ($dest ?? .New WebApplication1.Controllers.SampleDataController+ExpenseReportItem());
        .Try {
            .Block(System.Int32 $resolvedValue) {
                .Block() {
                    $resolvedValue = .If (
                        $src == null || False
                    ) {
                        .Default(System.Int32)
                    } .Else {
                        $src.Id
                    };
                    $typeMapDestination.Id = $resolvedValue
                }
            }
        } .Catch (System.Exception $ex) {
            .Block() {
                .Throw .New AutoMapper.AutoMapperMappingException(
                    "Error mapping types.",
                    $ex,
                    .Constant<AutoMapper.TypePair>(AutoMapper.TypePair),
                    .Constant<AutoMapper.TypeMap>(AutoMapper.TypeMap),
                    .Constant<AutoMapper.PropertyMap>(AutoMapper.PropertyMap));
                .Default(System.Int32)
            }
        };
        $typeMapDestination
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...