Automapper中的行为不一致

时间:2013-03-02 13:30:46

标签: c# asp.net-mvc-4 asp.net-web-api automapper

在我的项目中发生了很奇怪的事情,我有一个非常简单的CLR个对象, 第一个是Model其他是ViewModel,在我编译项目后,运行我的WebApi ASP.NET项目,使用所需的参数,我可以看到我的Model返回数据

有一次我可以看到Mapper确实映射好了,第二次它返回所有带空值的东西。 问题不是一直发生的。

非常重要:更新2013年3月14日
当我回收应用程序时,它停止这样做, 但过了一段时间它再次开始这样做,我重新保存web.config文件 然后再好了。

这是我的Model / 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);

3 个答案:

答案 0 :(得分:3)

  1. 为什么用virtual关键字标记了您的非导航属性?只有涉及关系一对一,一对多,多对多和复杂类型的属性才能使用virtual关键字进行标记,以应用延迟加载。< / LI>

    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 
            }
        }
    

    以同样的方式,您可以将所有实体甚至集合映射到集合。

答案 1 :(得分:2)

很可能在Gallery和UIItem有交叉引用的情况下会发生这种情况:

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

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

你可以在你的代码中测试这个案例吗?

答案 2 :(得分:1)

您可以尝试使用

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

Mapper.Map(source);

并确保您已声明

CreateMap<Source, Destination>();

当您可以声明两种类型的CreateMap时,我看不到您使用动态地图的原因。你不应该这样做这样做。