我正在尝试在 mvc 中映射两个视图模型类 PackageViewModel 和 CompanyViewModel。在包视图中模型:
public int PackageID { get; set; }
public int CompanyID { get; set; }
public string PackageName { get; set; }
public string PackageDesc { get; set; }
public int BranchID { get; set; }
public bool IsActive { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
和在公司视图中
public int CompanyID { get; set; }
public string CompanyName{ get; set; }
public string CompanyCode { get; set; }
public bool IsActive { get; set; }
public string CreatedBy { get; set; }
public DateTime CreatedDate{ get; set; }
这里 PackageViewmodel 中的 companyID 是与公司表中的公司 ID 相关的外键。 这是在数据库中完成的...
现在我正在显示我需要公司名称的包裹详细信息...
我试过这样:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PackageViewModel, CompanyViewModel>();
});
var mapper = config.CreateMapper();
var dest = mapper.Map<PackageViewModel, CompanyViewModel>(new PackageViewModel());
请帮助我..谢谢。。
你没有提供更多关于你的愿望的细节,但我会试着回答。
-
第一个问题是:你没有完全的模型之间的"兼容性",这是自动映射器所必需的(通过命名约定(。建议编写自定义类型转换器或内联函数,自动映射器文档中有很好的示例。
-
如果您不访问解析器中的数据,因为在您的示例中,一个模型(公司(中的属性在其他模型(包(中不存在,则检索数据库。建议是:在自定义解析器的构造函数中注入依赖项并检索数据以解析属性
它是可能的解决方案的草案,我不知道您的数据访问层。
// Current configuration upgrade
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PackageViewModel, CompanyViewModel>()
.ConvertUsing<MyCustomTypeConverter>()
});
// Ps: Not necessary send a new PackageViewModel
// The custom Type Converter
public sealed class MyCustomTypeConverter : ITypeConverter<PackageViewModel, CompanyViewModel>
{
public CompanyViewModel Convert(ResolutionContext context)
{
// If necessary you access your data layer
var companyData = AnyDataAccessLayer.GetById(context.SourceValue.CompanyID);
var newCompanyViewModel = new CompanyViewModel
{
// Mix database info with you PackageViewModel info
}
return newCompanyViewModel;
}
}
- 您可能希望保持零件自动并仅在命名约定之外解析,这样就可以使用方法。映射器之后。
用。后映射方法
// Current configuration upgrade
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PackageViewModel, CompanyViewModel>()
.AfterMap((source, destination) =>
{
// If necessary you access your data layer
var companyData = AnyDataAccessLayer.GetById(source.CompanyID);
// Resolve properties
destination.CompanyName = companyData.CompanyName;
destination.CompanyCode = companyData.CompanyCode;
});
});
// Ps: Not necessary a CustomTypeConverter