【问题标题】:AutoMapper and Navigational PropertiesAutoMapper 和导航属性
【发布时间】:2016-01-28 20:51:41
【问题描述】:

有没有人遇到过以下情况。我有一个 MVC 应用程序,我正在使用实体框架。我有一个要填充到下拉框中的外键,当用户选择他们的选择并提交表单时,我收到一个关于无法映射的错误。

我有以下实体:

public Class City{
 public int Id {get; set;}
 public string Name {get; set;}
}


public class Property {
 public int Id {get; set;}
 public string Description {get; set;}
 public Virtual City City {get; set;}
}

我有以下视图模型

public class AddPropertyVM {

  public AddPropertyViewModel(IEnumerable<City> cities){
    _cities = cities;
  } 

  public AddPropertyViewModel(){}

  public string Description {get; set;}
  public int SelectedCityId {get; set;}
  public IEnumerable<SelectListItem> CitiesItems {
    get {
      return new SelectList(_cities, "Id", "Name");
    }
  }

  private IEnuermable<City> _cities {get; set;}
}

我有以下 AutoMapper 配置:

config.CreateMap<Property, AddPropertyViewModel>().ReverseMap();

当我尝试像这样将 VM 映射回属性实体时:

var newProperty = AutoMapper.Mapper.Map<AddPropertyViewModel, Property>(property);

我收到以下错误:

缺少类型映射配置或不支持的映射。

映射类型: Int32 -> 城市 System.Int32 -> Test.Entities.City

目标路径: 物业.城市.城市

来源价值: 2

有人知道为什么会这样吗?任何帮助/指导将不胜感激。

就这么清楚了。我正在尝试从 SelectedCityId 中取回 City。

我已尝试设置 AfterMap,但仍然遇到同样的问题:

config.CreateMap<AddPropertyViewModel, Property>().AfterMap((s, d) => d.City = new City { id = s.City });

【问题讨论】:

  • 不想变得粗鲁,但如果我看到你将Property 映射到AddPropertyViewModel,我想知道你是否了解 AutoMapper 的用途。唯一可以按约定映射的属性是Description。其余的我看不到任何指定的成员映射。另外,我认为您有一两个错字。类名应该是AddPropertyViewModel,AutoMapper 不可能配对SelectedCityIdCity(显然是这样)。
  • 您好,谢谢。实际上,我在 Entity 和 VM 上有更多匹配的属性。为简洁起见,我在这里仅列出了一些属性。我尝试将 SelectedCityId 更改为 City 但这也不起作用。我不确定如何映射到 Navigational 属性。我有 City id,但 automapper 无法将其映射到 City 对象。
  • 不,当然不能。你认为它应该如何自己做到这一点?
  • Automapper 需要一些额外的配置。这就是为什么我要问是否有人遇到过类似的情况。我现在正在玩 AfterMap。我也许可以创建一个新城市
  • @GertArnold 按建议更新

标签: c# entity-framework model-view-controller automapper viewmodel


【解决方案1】:

您的属性类有单个对象 City 但另一个类有 ienumerable ...

private IEnuermable<City> _cities {get; set;}

您应该使两个类相互兼容。

【讨论】:

  • 是 - 该物业只有一个城市。但是,VM 在数据库中创建了所有城市的下拉列表,因此我抓取所有城市并将其传递给 VM 构造函数并构建选择列表。我真的看不出有任何其他方式来做到这一点
  • Automapper 基于相同的成员名称创建映射。在您的情况下,您必须进行如下自定义映射: config.CreateMap().ForMember( dest => dest.SelectedCityId, opt => opt.MapFrom(src => src.Id) )
  • 如果您需要查找列表来从中选择城市,可以使用 map.UseValues。在你的虚拟机中声明一个列表,例如:public string[] Sharetypes { get;放;然后用这样的东西映射它: .ForMember(vm => vm.Sharetypes, map => map.UseValue(Enum.GetNames(typeof(ShareType)).ToArray()));在示例中,我得到一个枚举名称列表,但您应该能够将其更改为查询以返回城市对象列表
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2023-01-26
  • 2012-09-21
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多