2013-03-02 3 views
4

Очень странная вещь случилась в моем проекте, у меня есть довольно простые CLR объектов, Первых из них является Model другого ViewModel, после того, как я скомпилировать проект я запустить мой WebApi ASP.NET проект с требуемыми параметрами, я может видеть, что мои Model возвращаются с данными.непоследовательность в Automapper

Как только я вижу, что Mapper сделал отображение в порядке, а во второй раз он возвращает все с нулями. Проблема, которая не всегда происходит.

Очень важно: обновление 14.03.2013
Это прекратить делать это, когда я перерабатывают приложение, , но через некоторое время это начать делать это снова, я повторно сохранить файл web.config , то это нормально снова.

Вот моя модель/ViewModel:

public class Gallery : Entity 
{ 
    public override long Id { get; set; } 
    public virtual Settings SiteOwner { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual string PageTitle { get; set; } 
    public virtual string TitleDescription { get; set; } 
    public virtual string GalleryTitle { get; set; } 
    public virtual IList<UIItem> GalleryItems { get; set; } 
} 

public class UIItem : Entity 
{ 
    public override long Id { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Gallery Gallery { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual string Price { get; set; } 
    public virtual string ImageUrl { get; set; } 
    public virtual string VideoUrl { get; set; } 
    public virtual string FileUrl { get; set; } 
} 
public class GalleryViewModel 
{ 
    public virtual string PageTitle { get; set; } 
    public virtual string TitleDescription { get; set; } 
    public virtual string GalleryTitle { get; set; } 
    public virtual IList<UIItemViewModel> GalleryItems { get; set; } 
} 

public class UIItemViewModel 
{ 
    public virtual long Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual string Price { get; set; } 
    public virtual string ImageUrl { get; set; } 
    public virtual string VideoUrl { get; set; } 
    public virtual string FileUrl { get; set; } 
} 

Вот как я использую его

// my apicontroller 

// FindGalleryByAppIdAndCategoryId returns => Gallery 
var source = _galleryRepository.FindGalleryByAppIdAndCategoryId(appId, catId); 
return Mapper.DynamicMap<GalleryViewModel>(source); 
+0

пожалуйста, вы можете отметить тип возврата FindGalleryByAppIdAndCategoryId ИЛИ какой именно тип источника –

+0

Fixed его в вопросе – IamStalker

+1

пожалуйста, убедитесь, что, когда вы получаете нулевые значения в galleryViewModel источник, который вы передаете в не пустой –

ответ

2

Скорее всего, это происходит в тех случаях, когда галерея и UIItem имеют перекрестные ссылки:

public class Gallery : Entity 
{ 
    public virtual IList<UIItem> GalleryItems { get; set; } 
} 

public class UIItem : Entity 
{ 
    public virtual Gallery Gallery { get; set; } 
} 

Не могли бы вы проверить этот случай в своей треске е?

+0

Да, я проверю его, но одна проблема, я не сопоставляю его с DomainModel для DomainModel i map to ViewModel – IamStalker

+0

it мне не помогли – IamStalker

+0

Дима, как ты это исправишь? – IamStalker

1

Вы можете попробовать использовать

Mapper.Map<Source,Destination>(source); 

или

Mapper.Map(source); 

и убедитесь, что вы объявили

CreateMap<Source, Destination>(); 

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

3
  1. Почему вы отметили свои неопасные свойства с помощью ключевого слова virtual? Только свойства, связанные с отношениями один-на-один, один-ко-многим, многие-ко-многим и сложным типам, могут быть помечены знаком virtual для применения ленивая загрузка.

2.

Mapper.CreateMap<UIItem,UIItemViewModel>(); 
... 
UIItemViewModel result = Mapper.Map<UIItem,UIItemViewModel>(your UIItem); 

Если вам нужна специальная логика отображения, вы можете сделать так:

Mapper.CreateMap<UIItem,UIItemViewModel>().ConvertUsing(new ModelToViewModelConverter()); 
... 
UIItemViewModel result = Mapper.Map<UIItem,UIItemViewModel>(your UIItem); 
... 

конвертер будет выглядеть следующим образом:

public class ModelToViewModelConverter : ITypeConverter<UIItem,UIItemViewModel> 
    { 
     public UIItemViewModel Convert(ResolutionContext context) 
     { 
      UIItem item = (UIItem)context.SourceValue; 
      // Perform your convertion logic 
     } 
    } 

В так же, как вы можете отобразить все ваши сущности, даже коллекцию в коллекцию.

+0

Действительно, о чем я думал, я не уверен, почему он полагается на DynamicMap, если он не нужен на самом деле. Я бы использовал Dynamic в ужасных ситуациях –

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