我在尝试使用复杂类型时遇到问题AutoMapper。复杂类型的AutoMapper
我有两个对象,一个域和ViewModel utlize在我的视图;
视图模型
public class RegisterCoupleModel
{
[Required(ErrorMessage = "campo obrigatório")]
[Display(Name = "Primeiro nome", Order = 0, GroupName = "Noivo")]
[StringLength(60)]
public string FistNameGroom
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[Display(Name = "Último nome", Order = 1, GroupName = "Noivo")]
[StringLength(60)]
public string LastNameGroom
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[RegularExpression(@"^[\w-\.][email protected]([\w-]+\.)+[\w-]{2,4}$", ErrorMessage = "Formato de email inválido.")]
[DataType(DataType.EmailAddress)]
[Remote("IsEmailAvailable", "Validation", "", ErrorMessage = "este email já está sendo usado por outro usuário.")]
[Display(Name = "Email", Order = 2, GroupName = "Noivo")]
[StringLength(180)]
public string EmailGroom
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[Display(Name = "Primeiro nome", Order = 0, GroupName = "Noiva")]
[StringLength(60)]
public string FistNameBride
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[Display(Name = "Último nome", Order = 1, GroupName = "Noiva")]
[StringLength(60)]
public string LastNameBride
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[RegularExpression(@"^[\w-\.][email protected]([\w-]+\.)+[\w-]{2,4}$", ErrorMessage = "Formato de email inválido.")]
[DataType(DataType.EmailAddress)]
[Remote("IsEmailAvailable", "Validation", "", ErrorMessage = "este email já está sendo usado por outro usuário.")]
[Display(Name = "Email", Order = 2, GroupName = "Noiva")]
[StringLength(180)]
public string EmailBride
{
get;
set;
}
[Required(ErrorMessage = "campo obrigatório")]
[Display(Name = "Url")]
[RegularExpression(@"^[a-zA-Z0-9_\-\.\+]{5,22}$", ErrorMessage = "Chave inválida")]
[StringLength(22, MinimumLength = 5, ErrorMessage = "A chave deve ter entre {0} e {1} caracteres.")]
[Remote("IsKeywordAvaliable", "Validation")]
public string UrlKeyword
{
get;
set;
}
[Display(Name = "Voce é humano?")]
[UIHint("ReCaptcha")]
public string ReCaptcha
{
get;
set;
}
}
域对象
public class Couple
{
[Key]
public Guid Id { get; set; }
public string UrlKeyword { get; set; }
public virtual Partner Groom { get; set; }
public virtual Partner Bride { get; set; }
public DateTime Marriage { get; set; }
public DateTime Dating { get; set; }
public DateTime Engagement { get; set; }
public virtual ICollection<User> Users { get; set; }
}
如果你看看你会看到我的对象Couple
域有属性有Bride
和Groom
这实际上是同一类型。
如何映射我的域对象Couple
与RegisterCoupleModel
?
这里我做到了尽可能:
在设置automapper试着这样做:
CreateMap<RegisterCoupleModel, Couple>()
.ForMember(dest => dest.Bride.User.FirstName, opt => opt.MapFrom(source => source.FistNameBride))
.ForMember(dest => dest.Bride.User.LastName, opt => opt.MapFrom(source => source.LastNameBride))
.ForMember(dest => dest.Bride.User.Email, opt => opt.MapFrom(source => source.EmailBride))
.ForMember(dest => dest.Groom.User.FirstName, opt => opt.MapFrom(source => source.FistNameGroom))
.ForMember(dest => dest.Groom.User.LastName, opt => opt.MapFrom(source => source.LastNameGroom))
.ForMember(dest => dest.Groom.User.Email, opt => opt.MapFrom(source => source.EmailGroom));
但显示以下错误:
表达“DEST => dest.Bride.User.FirstName'必须解析为 顶级成员。参数名称:lambda表达式
我知道这需要尝试使用映射属性与嵌套类型的行为。
但我怎么能映射到RegisterCoupleModel
和Couple
两个属性Bride
和Groom
是同一类型?
我发现question here on StackOverflow看起来像这样,但它帮助了我。
但是属性如何? 如果封装这些字段,新娘和新郎的属性设置是相同的。 因此,例如,我无法更改显示文本或GrupName显示属性。 – ridermansb
@Riderman - 使用一些OO技巧,例如制作PersonDetails抽象,然后为BrideDetails和GroomDetails创建派生类。在基础中设置公共属性,然后覆盖不同的属性。 – RPM1984
我使用助手:'@ Html.EditorForModel()'生成表单,但它不生成嵌套类型。 如何封装这三个属性,并使帮助器继续在窗体中显示它们? – ridermansb