2016-07-18 4 views
0

Я действительно вытягиваю свои волосы с помощью Automapper. Я считаю его неинтуитивным и очень сложным в использовании. Было бы намного проще написать код отображения вручную. У меня есть два простых типов:Невозможно сопоставить бизнес-объект с объектом данных

namespace BusinessObjects 
    { 
     public class Application 
     { 
      public int ID { get; set; } 
      public string FirstName { get; set; } 
      public string Surname { get; set; } 
      public System.DateTime DateOfBirth { get; set; } 
      public System.DateTime CreatedTime { get; set; } 
      public System.DateTime ModifiedTime { get; set; } 
      public System.DateTime ApplicationDate { get; set; } 
      public string Qualified { get; set; } 
      public int salary { get; set; } 
      public string userID { get; set; } 
    } 
    } 

namespace DataObjects 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Application 
    { 
     public int ID { get; set; } 
     public string FirstName { get; set; } 
     public string Surname { get; set; } 
     public System.DateTime DateOfBirth { get; set; } 
     public System.DateTime CreatedTime { get; set; } 
     public System.DateTime ModifiedTime { get; set; } 
     public System.DateTime ApplicationDate { get; set; } 
     public string Qualified { get; set; } 
     public int salary { get; set; } 
     public string userID { get; set; } 
    } 
} 

и контроллер:

public ApplicationController() 
     { 
      Mapper.Initialize(cfg => cfg.CreateMap<BusinessObjects.Application, ApplicationModel>()); 
      config = new MapperConfiguration(cfg => 

      { 
       cfg.CreateMap<BusinessObjects.Application, ApplicationModel>(); 
      }); 
      config.AssertConfigurationIsValid(); 

      Mapper.Initialize(cfg => cfg.CreateMap<ApplicationModel,BusinessObjects.Application>()); 
      config2 = new MapperConfiguration(cfg => 

      { 
       cfg.CreateMap<ApplicationModel,BusinessObjects.Application>(); 
      }); 
      config2.AssertConfigurationIsValid(); 

     } 

    public int Create(BusinessObjects.Application businessApplication) 
      { 
       var mapper =config2.CreateMapper(); 
       DataObjects.Application dataApplication = AutoMapper.Mapper.Map<DataObjects.Application>(businessApplication); 

       int count = 0; 
       using (CreditCardPreQualificationEntities CreditCardPreQualificationDatabase = new CreditCardPreQualificationEntities()) 
       { 
        CreditCardPreQualificationDatabase.Applications.Add(dataApplication); 
        count = CreditCardPreQualificationDatabase.SaveChanges(); 
       } 
       return count; 
      } 

Я провел почти все выходные пытается получить это не работать, и я не ближе. Я не вижу преимущества Automapper вообще. Ошибка, которую я получаю: «Исключение типа« AutoMapper.AutoMapperMappingException »произошло в AutoMapper.dll, но не было обработано в коде пользователя

Дополнительная информация: Отсутствует тип конфигурации карты или неподдерживаемое отображение.« Пожалуйста, помогите.

+0

... Также ваш код инициализации очень запутан: вам нужно только настроить AutoMapper один раз в начале вашего приложения, и вам нужно только создать карту каждого типа один раз. – stuartd

+0

@stuartd, где вы помещаете код инициализации? Я ввел его дважды, то есть один раз из бизнес-объекта в объект данных и один раз из объекта данных в бизнес-объект. Это неправильно? – w0051977

+0

В приложении MVC в приложении Application_Start(). Вы должны только инициализировать AutoMapper один раз, и ** использовать либо старый синтаксис, либо новый, а не оба **. Старый способ был бы таким простым, как «Mapper.Initialize» (cfg => { cfg.CreateMap (); cfg.CreateMap (); }); ', а затем' Mapper.Map (businessApplication); ' – stuartd

ответ

1

Ваша конфигурация выглядит ... выключена. Как говорят документы, вам нужно инициализировать AutoMapper один раз и только один раз для всего AppDomain. В вашем global.asax (или аналогичный), добавьте:

Mapper.Initialize(cfg => { 
    cfg.CreateMap<BusinessObjects.Application, DataObjects.Application>() 
     .ReverseMap(); 
}); 

Похоже, что вам нужны карты в обоих направлениях, так что я добавил ReverseMap. Затем в контроллере, удалить все, что инициализация и создание картографа мусор, а просто использовать AutoMapper непосредственно:

public int Create(BusinessObjects.Application businessApplication) 
     { 
      DataObjects.Application dataApplication = Mapper.Map<BusinessObjects.Application, DataObjects.Application>(businessApplication); 

      int count = 0; 
      using (CreditCardPreQualificationEntities CreditCardPreQualificationDatabase = new CreditCardPreQualificationEntities()) 
      { 
       CreditCardPreQualificationDatabase.Applications.Add(dataApplication); 
       count = CreditCardPreQualificationDatabase.SaveChanges(); 
      } 
      return count; 
     } 

Готово!

+0

Спасибо. У меня была конфигурация в конструкторах, и конфигурация была перезаписана. Я разрешил это быстро в прошлом году. – w0051977

+0

Не могли бы вы рассказать о моем недавнем вопросе Automapper здесь: https://stackoverflow.com/questions/44973239/automapper-without-the-new-keyword? – w0051977

Смежные вопросы