在我的项目中发生了很奇怪的事情,我有一个非常简单的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);
答案 0 :(得分:3)
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时,我看不到您使用动态地图的原因。你不应该这样做这样做。