AutoMapper.AutoMapperMappingException

Я знаю, что в этой теме было задано много вопросов, но никто из них не ответил на мои проблемы. Вот почему я задаю новый вопрос.

Я посмотрел на Google и здесь для ответов и нашел некоторые, которые улучшили мою настройку AutoMapper. (т. е. только создание ваших сопоставлений только один раз)

Моя проблема в том, что я иногда получаю исключение, а иногда и нет. И я понятия не имею, как его решить. Я искал целый день и ничего не могу найти.

Когда я запускаю Mapper.AssertConfigurationIsValid (), он преуспевает.

Я попытался добавить следующее:

Mapper.Configuration.AllowNullDestinationValues = true;
Mapper.AllowNullDestinationValues = true;  

И все же я получаю ошибки: s

Моя настройка такова:

В моем файле global.asax я вызываю AutoMapperSetup.SetupAutoMapper ().

protected void Application_Start(object sender, EventArgs e)
    {
        ...
        AutoMapperSetup.SetupAutoMapper();
    }

Класс AutoMapperSetup описан ниже: (Я знаю, что мой статический конструктор запускается. Если я поставил точку останова, он попадает в цель, поэтому этот код выполняется)

public static class AutoMapperSetup
{

static AutoMapperSetup()
    {
        #region GetPlanning
        Mapper.CreateMap()
            .ForSourceMember(x => x.ItemSelection, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.AnomalyID, y => y.Ignore())
            .ForSourceMember(x => x.Dispatcher, y => y.Ignore())
            .ForSourceMember(x => x.IsDealed, y => y.Ignore())
            .ForSourceMember(x => x.AnomalyDateTime, y => y.Ignore())
            .ForSourceMember(x => x.Trip, y => y.Ignore())
            .ForSourceMember(x => x.Place, y => y.Ignore())
            .ForSourceMember(x => x.Job, y => y.Ignore())
            .ForSourceMember(x => x.Product, y => y.Ignore())
            .ForSourceMember(x => x.Vehicle, y => y.Ignore())
            .ForSourceMember(x => x.Driver, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));

        Mapper.CreateMap()
            .ForSourceMember(x => x.Code, y => y.Ignore())
            .ForSourceMember(x => x.ID, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.LastName, y => y.Ignore())
            .ForSourceMember(x => x.FirstName, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.LicensePlate, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap<tripResult_v3, FWSTripResult>()
            .ForSourceMember(x => x.ModificationDate, y => y.Ignore())
            .ForSourceMember(x => x.ModificationID, y => y.Ignore())
            .ForSourceMember(x => x.ModificationNumber, y => y.Ignore())
            .ForSourceMember(x => x.EndDate, y => y.Ignore())
            .ForSourceMember(x => x.ExternalSynchStatus, y => y.Ignore())
            .ForSourceMember(x => x.CreatedByDriver, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap<trip, FWSTrip>()
            .ForSourceMember(x => x.References, y => y.Ignore())
            .ForSourceMember(x => x.TypeCustom, y => y.Ignore())
            .ForSourceMember(x => x.CustomNr, y => y.Ignore())
            .ForSourceMember(x => x.StartTripAct, y => y.Ignore())
            .ForSourceMember(x => x.StopTripAct, y => y.Ignore())
            .ForSourceMember(x => x.OrderSeq, y => y.Ignore())
            .ForSourceMember(x => x.Overwrite, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.ModificationDate, y => y.Ignore())
            .ForSourceMember(x => x.ModificationID, y => y.Ignore())
            .ForSourceMember(x => x.ModificationNumber, y => y.Ignore())
            .ForSourceMember(x => x.SessionID, y => y.Ignore())
            .ForSourceMember(x => x.Export, y => y.Ignore())
            .ForSourceMember(x => x.ReadDateTime, y => y.Ignore())
            .ForSourceMember(x => x.Format, y => y.Ignore())
            .ForSourceMember(x => x.Documents, y => y.Ignore())
            .ForSourceMember(x => x.TachoActivities, y => y.Ignore())
            .ForSourceMember(x => x.EndDate, y => y.Ignore())
            .ForSourceMember(x => x.DriverInfo, y => y.Ignore())
            .ForSourceMember(x => x.AlarmDateTime, y => y.Ignore())
            .ForSourceMember(x => x.ExternalSynchStatus, y => y.Ignore())
            .ForSourceMember(x => x.CreatedByDriver, y => y.Ignore())
            .ForSourceMember(x => x.Comments, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.References, y => y.Ignore())
            .ForSourceMember(x => x.CustomNr, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.ModificationDate, y => y.Ignore())
            .ForSourceMember(x => x.ConsultationID, y => y.Ignore())
            .ForSourceMember(x => x.Vehicle, y => y.Ignore())
            .ForSourceMember(x => x.Driver, y => y.Ignore())
            .ForSourceMember(x => x.Position, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.Date, y => y.Ignore())
            .ForSourceMember(x => x.InfoID, y => y.Ignore())
            .ForSourceMember(x => x.Export, y => y.Ignore())
            .ForSourceMember(x => x.Activity, y => y.Ignore())
            .ForSourceMember(x => x.Vehicle, y => y.Ignore())
            .ForSourceMember(x => x.Driver, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap<tripIdentifier, FWSTripIdentifier>()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));

        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.Author, y => y.Ignore())
            .ForSourceMember(x => x.Export, y => y.Ignore())
            .ForSourceMember(x => x.CreatedbyDriver, y => y.Ignore())
            .ForSourceMember(x => x.ExternalSynchStatus, y => y.Ignore())
            .ForSourceMember(x => x.Transfer, y => y.Ignore())
            .ForSourceMember(x => x.CancelStatus, y => y.Ignore())
            .ForSourceMember(x => x.ModificationDate, y => y.Ignore())
            .ForSourceMember(x => x.ModificationID, y => y.Ignore())
            .ForSourceMember(x => x.ModificationNumber, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.ModificationDate, y => y.Ignore())
            .ForSourceMember(x => x.ModificationID, y => y.Ignore())
            .ForSourceMember(x => x.ModificationNumber, y => y.Ignore())
            .ForSourceMember(x => x.Format, y => y.Ignore())
            .ForSourceMember(x => x.ProductType, y => y.Ignore())
            .ForSourceMember(x => x.Export, y => y.Ignore())
            .ForSourceMember(x => x.Transfer, y => y.Ignore())
            .ForSourceMember(x => x.ExternalSynchStatus, y => y.Ignore())
            .ForSourceMember(x => x.CreatedByDriver, y => y.Ignore())
            .ForSourceMember(x => x.TnrPlace, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.OrderSeq, y => y.Ignore())
            .ForSourceMember(x => x.DriverDisplay, y => y.Ignore())
            .ForSourceMember(x => x.Comment, y => y.Ignore())
            .ForSourceMember(x => x.CustomNr, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForSourceMember(x => x.References, y => y.Ignore())
            .ForSourceMember(x => x.CustomNr, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap<transfer, FWSTransfer>()
            .ForSourceMember(x => x.SendDateTime, y => y.Ignore())
            .ForSourceMember(x => x.TransferCancelID, y => y.Ignore())
            .ForSourceMember(x => x.TransferDateTime, y => y.Ignore())
            .ForSourceMember(x => x.TransferID, y => y.Ignore())
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));

        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        Mapper.CreateMap()
            .ForAllMembers(op => op.Condition(x => !x.IsSourceValueNull));
        #endregion

        #region InsertUpdatePlanning
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.TypeCustom, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore())
            .ForMember(x => x.StartTripAct, y => y.Ignore())
            .ForMember(x => x.StopTripAct, y => y.Ignore())
            .ForMember(x => x.OrderSeq, y => y.Ignore())
            .ForMember(x => x.Overwrite, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.TypeCustom, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore())
            .ForMember(x => x.StartTripAct, y => y.Ignore())
            .ForMember(x => x.StopTripAct, y => y.Ignore())
            .ForMember(x => x.OrderSeq, y => y.Ignore())
            .ForMember(x => x.Overwrite, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.OrderSeq, y => y.Ignore())
            .ForMember(x => x.DriverDisplay, y => y.Ignore())
            .ForMember(x => x.Comment, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.OrderSeq, y => y.Ignore())
            .ForMember(x => x.DriverDisplay, y => y.Ignore())
            .ForMember(x => x.Comment, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap()
            .ForMember(x => x.References, y => y.Ignore())
            .ForMember(x => x.CustomNr, y => y.Ignore());
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        Mapper.CreateMap();
        #endregion

        #region InsertUpdateSettings
        Mapper.CreateMap();
        #endregion

        #region Cancel Planning
        Mapper.CreateMap();
        #endregion
    }

public static void SetupAutoMapper()
    {

    }
}

Это вызвано, когда я запускаю свои WebServices. Следующий шаг - получить данные из БД и сопоставить это с моим DTO:

FWSGetPlanningResult resultToReturn = Mapper.Map(result);

Выполнение вышеуказанной строки кода дает мне ошибку исключения отображения. Ниже детали исключения:

AutoMapper.AutoMapperMappingException occurred
HResult=-2146233088
Message=Missing type map configuration or unsupported mapping.

Mapping types:
GetPlanningResult_v3 -> FWSGetPlanningResult
BusinessFramework.Data.Planning.Result.GetPlanningResult_v3 -> BusinessFramework.Data.Planning.FWSGetPlanningResult

Destination path:
FWSGetPlanningResult

Source value:
BusinessFramework.Data.Planning.Result.GetPlanningResult_v3
Source=AutoMapper
StackTrace:
   at Desktop.Web.Fleet.DBFactory.ConvertFromGetPlanningResult(GetPlanningResult_v3 result) in c:\TFSProjects\Tx-Framework\Framework\Main\Source\BusinessFramework\Services.Fleet\Classes\DB\Factories\Planning.cs:line 593
InnerException: 

Я надеюсь, что кто-то может дать мне решение .. Как вы можете видеть по количеству объектов. Я не так хочу начать отображать все вручную.

Заранее спасибо!

3
nl ja de
Можете ли вы опубликовать код, который вызывает AutoMapperSetup - он почти выглядит так, что конфигурация не была инициализирована правильно.
добавлено автор Mightymuke, источник
Правильно ли этот код? Вы вызываете SetupAutoMapper , который является пустым методом. Отображения находятся в AutoMapperSetup . т.е. - вы не создаете AutoMapperSetup , а вызываете его пустой статический метод.
добавлено автор Mightymuke, источник
Да, мой плохой, не думал. (В моей защите код немного неясен :)). Сожалею.
добавлено автор Mightymuke, источник
Мои простые модульные тесты проходят с вашей настройкой. Любой шанс GetPlanningResult_v3 или FWSGetPlanningResult в сопоставлении из разных пространств имен, чем BusinessFramework.Data.Planning.Result.GetPlanningResult_v3 или BusinessFramework.Data .Planning.FWSGetPlanningResult
добавлено автор Mightymuke, источник
Тогда извините, я понятия не имею, что из предоставленной информации. Единственное, что я могу предложить, это разбить отображение (т. Е. Удалить один из игнорируемых или что-то еще), а затем подтвердить, что сбой AssertConfigurationIsValid (т. Е. Red-green-refactor)
добавлено автор Mightymuke, источник
Конечно, предполагается, что вы вызываете его из Application_Start , а не в модульный тест (т. Е. Чтобы убедиться, что сопоставление фактически настроено в вашей веб-службе). Кроме того, если 2 класса нетривиальны, он может заплатить также, если это возможно, сообщение.
добавлено автор Mightymuke, источник
Кроме того, небольшая точка, не уверенный, что вам нужен этот ForSourceMember , игнорирует. Automapper не работает таким образом. Его касается только свойств объекта назначения.
добавлено автор Mightymuke, источник
возможно, FWSGetPlanningResult содержит некоторую коллекцию. AutoMapper не знает, как создавать или сопоставлять.
добавлено автор Dirk Trilsbeek, источник
Привет, я редактировал свой пост и добавил полный класс AutoMapperSetup. Я также опубликовал метод Application_Start из global.asax, который вызывает код AutoMapperSetup.
добавлено автор JeremyVm, источник
@Mightymuke: Это статический конструктор. Статический конструктор вызывается при первом обращении к классу. Поэтому, если я вызываю этот метод, тогда мой статический конструктор запускается первым. Я могу поместить код в метод, который я вызываю, но это не помогло бы.
добавлено автор JeremyVm, источник
@DirkTrilsbeek: Может ли AssertConfiguration не видеть это? Обычно это не должно быть проблемой, поскольку иногда можно просматривать информацию.
добавлено автор JeremyVm, источник
Только что проверил. Это правильные пространства имен.
добавлено автор JeremyVm, источник
Спасибо за вашу помощь :) Я посмотрю ваше предложение и посмотрю, что он делает.
добавлено автор JeremyVm, источник

1 ответы

Моя проблема исправлена. Проблема заключалась в следующем:

В нашем решении мы недавно начали работать с МОК. Кто-то создал TypeAdapter с AutoMapperTypeAdapter в качестве объекта ссылки.

Когда в нашем приложении был открыт или введен какой-либо модуль, Automapper снова инициализируется, и мои сопоставления, созданные в global.asax, были удалены.

После изменения моего кода, который также работал с помощью TypeAdapter, моя проблема была исправлена.

Спасибо за все, кто пытается мне помочь!

2
добавлено
Вы знаете, в каких случаях инициализируется AutoMapper?
добавлено автор user823959, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot