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

时间:2016-02-10 22:10:56

标签: asp.net-mvc automapper viewmodel

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

请帮帮我.. 谢谢..

1 个答案:

答案 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;
    }
}
  • 您可能希望自动保留部件并仅在命名约定之外解决,这样可以使用方法.AfterMapper

使用.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