映射两个与外键相关的 MVC 视图模型



我正在尝试在 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

相关内容

  • 没有找到相关文章

最新更新