在我的NHIbernate(数据库模型)中我有这个:
public class Pers {
public int Id{ get; set ;}
public string FirstName{ get; set ;}
public string LastName{ get; set ;}
public string City{ get; set ;}
public int Age{ get; set ;}
public Role Role{ get; set ;}
}
我有一些dropwon(数据库模式):
public class Role {
public int Id{ get; set ;}
public string NL{ get; set ;}
public string FR{ get; set ;}
}
在我看来,我想使用下拉列表并显示Pers
的一些记录(不是全部,在我的真实课程中还有更多属性)。我为Pers创建了一个Dto类,其中包含我需要的字段:
public class PersDto {
public int Id{ get; set ;}
public string FirstName{ get; set ;}
public string LastName{ get; set ;}
public RoleDto RoleDto{ get; set ;}
}
public class RoleDto {
public int Id{ get; set ;}
public string NL{ get; set ;}
public string FR{ get; set ;}
}
在控制器中:
Mapper.CreateMap<Role, RoleDto>();
myModel.RoleDto = Mapper.Map<Role, RoleDto>(roleListFromDB);
Mapper.CreateMap<Pers, PersDto>();
myModel.PersDto = Mapper.Map<Pers, PersDto>(persFromDB);
public class MyModel{
public PersDto PersDto{ get; set ;}
public RoleDto RoleDto{ get; set ;}
}
这是正确的方法吗?或者最好通过创建PersDto
:
public class MyModel{
public string FirstName{ get; set ;}
public string LastName{ get; set ;}
public RoleDto RoleDto{ get; set ;}
}
是否可以使用automapper仅复制某些字段而不是全部?
谢谢,
答案 0 :(得分:2)
这是正确的方法吗?
不,你不应该在控制器中调用Mapper.CreateMap<TSource, TDest>
。此方法应仅在AppDomain的整个生命周期内调用一次,最好在Application_Start
中调用。
您可以编写映射配置文件:
public class PersonProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<Role, RoleDto>();
Mapper.CreateMap<Pers, PersDto>();
}
}
然后在Application_Start中配置这些配置文件:
Mapper.AddProfile(new PersonProfile());
最后在你的控制器中只使用Mapper.Map<TSource, TDest>
方法:
var myModel = new MyModel();
myModel.RoleDto = Mapper.Map<Role, RoleDto>(roleListFromDB);
myModel.PersDto = Mapper.Map<Pers, PersDto>(persFromDB);
return View(myModel);
答案 1 :(得分:0)
如果你的global.asax太大,你总是可以将命令分割为在启动时执行到其他类/方法,并使用Command pattern从Global调用它们;包括映射。
我们为映射使用单独的映射文件,当我们想忽略属性时,我们使用ignore method on AutoMapper。