我正在尝试在mvc中映射两个viewmodel类PackageViewModel和CompanyViewModel。 在PackageViewModel中:
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; }
并在CompanyView
中 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是与公司表中的Companyid相关的外键。这是在数据库中完成的......
现在我正在显示我需要companyName的包裹细节......
我试过这样的话:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<PackageViewModel, CompanyViewModel>();
});
var mapper = config.CreateMapper();
var dest = mapper.Map<PackageViewModel, CompanyViewModel>(new PackageViewModel());
请帮帮我.. 谢谢..
答案 0 :(得分:1)
你没有详细说明你的愿望,但我会尝试回答。
第一个问题是:您没有完整的兼容性&#34;在模型之间,这是自动映射器(通过命名约定)所必需的。 建议书是编写自定义类型转换器或内联函数,automapper documentation中有很多例子。
如果您没有访问解析器中的数据,因为在您的示例中,一个模型(公司)中的属性不存在于其他模型(包)中,检索数据库。建议是:在CustomResoler的构造函数中注入依赖项并检索数据以解析属性
它是可能解决方案的草案,我不了解您的数据访问层。
// 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;
}
}
使用.AfterMap方法
// 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