在我的视图的域模型中,我有以下对象作为我的属性的支持字段
public class ModelProperty<T>// where t:struct
{
public T Value { get; set; }
public string Description { get; set; }
public string LabelName { get; set; }
}
该对象依次表示为:
public partial class Incident : BaseEntityModel
{
private ModelProperty<string> typeCode = new ModelProperty<string>{Description="1-C", LabelName = "Type Code"};
private ModelProperty<string> typeText = new ModelProperty<string>{Description="1-C", LabelName = "Type Text"};
public ModelProperty<string> TypeCode { get {return typeCode;}}
public ModelProperty<string> TypeText { get {return typeText;}}
}
业务对象(我的来源)并不复杂。
public partial class Incident : ObjectBase
{
public string TypeCode { get; set; }
public string TypeText { get; set; }
}
是否可以将值从源映射到目标。使用Automapper我有以下映射设置
//note SrcObj is not an object but a namespace alias since the domain and business objects are of the same name
Mapper.CreateMap<SrcObj.Incident, Incident>()
.ForMember(ui => ui.TypeText.Value,
opt => opt.MapFrom(src => src.TypeText));
但我得到异常Expression必须解析为顶级成员而不是任何子对象的属性。请改用子类型或AfterMap选项上的自定义解析器。
我是自动播放器的新手,但在查看文档时,我正在处理的对象过于复杂(基于这里有三种类型而不是两种类型的想法)?
如果可以处理这种类型的映射,这是怎么做到的?
更新
根据Jimmy的建议,我更新了我的代码如下:
Mapper.CreateMap<SrcObj.Incident, Incident>();
Mapper.CreateMap<string, ModelProperty<string>>()
.ConvertUsing(src => new ModelProperty<string> { Value = src });
Mapper.AssertConfigurationIsValid();
SrcObj.Incident viewModelDto = md.GenerateMockIncident(); //populate the business object with mock data
uibase = Mapper.Map<SrcObj.Incident, Incident>(viewModelDto);
代码执行但我没有得到任何异常,但是在业务对象中设置和返回的值仍未分配给支持属性Value
它仍为空。
我错过了什么?
-cheers
答案 0 :(得分:2)
试试这个..您需要将ModelProperty对象映射到目标TypeText
Mapper.CreateMap<Funky.Incident, Incident>()
.ForMember(ui => ui.TypeText,
opt => opt.MapFrom(src =>
new ModelProperty<string>
{
Value = src.TypeText
}));
对TypeCode属性映射执行相同操作,以便映射所有字段。
您需要考虑每个成员映射,只要它们的名称不同或者它们的类型名称不同。在这种情况下,AutoMapper将很难将字符串转换为Model对象,直到您提供提示。
尝试映射TypeCode
..我也不知道ObjectBase等的属性。所以你需要检查是否还需要手动映射。
答案 1 :(得分:2)
更简单的方法是创建一个类型转换器:
Mapper.CreateMap<string, ModelProperty<string>>()
.ConvertUsing(src => new ModelProperty<string> { Value = src });
然后,每次AutoMapper看到字符串时,您都会看到此字符串 - &gt; ModelProperty。您根本不必进行特定于成员的配置。