【问题标题】:mapping with automapper missing properties自动映射器缺少属性的映射
【发布时间】:2017-03-06 21:32:31
【问题描述】:

我在使用自动映射器将我的对象映射到视图并返回到原始对象时遇到问题。

我有以下结构。

public class TModel
{
  public int TID{get;set;}
  public string Name{get;set;}
  public string Location{get;set;} 
  public string address{get;set;} 
}
public class UiModel
{
  public string Name{get;set;}
  public string Location{get;set;} 
}

在 AutoMapperConfiguration 类中,我初始化了我的自动映射器,如下所示:

cfg.CreateMap < TModel, UiModel  >();
cfg.CreateMap < UiModel,TModel > ();

我的适配器从 web 服务接收数据,这些数据我将存储在 TModel 项目列表中 视图只显示 UiModel 的项目,我将做以下映射并将数据返回到视图

var list = listOfT.Select(tmodel=> Mapper.Map<UiModel>(tmodel)).ToList();

完成所有更改后,我将列表返回给不同的适配器以将数据保存到数据库中

在这个'sqlAdapter'中,我将TModel类型的项目映射回来,因为我还想要我的数据库中的地址属性

var list = listOfUi.Select(uimodel=> Mapper.Map<TModel>(uimodel)).ToList();

但现在我丢失了地址属性的数据。 我还必须通过 TModel 的原始列表吗?...

【问题讨论】:

  • UiModel 类没有 Address 属性。因此,当您从 TModel 转换为 UiModel 时,它无处可用。这就是为什么当您将UiModel 转换回TModel 时,您没有获得Address 属性。

标签: c# automapper


【解决方案1】:

有几种不同的方法可以解决这个问题。最简单的答案是修改您的 UiModel 类,使其具有地址属性。所以像:

  public class UiModel
    {
      public string Name{get;set;}
      public string Location{get;set;} 
      public string address {get;set;}
    }

Automapper 首先尝试匹配属性名称。如果它没有找到匹配项,那么您必须修改您的类以使其找到匹配项,或者编写一个实现 IValueResolver 接口的类。更多信息请访问https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

【讨论】:

  • 我也在想用该属性扩展我的 UiModel 类。我没有把它放在那里的原因是因为我的视图模型没有地址属性的额外值。因此,我没有额外的价值,我将我的价值从 DB 的 web 服务拆分为仅针对视图和反手检查的数据提及的数据?
  • 我不明白你的问题。你是说你不想将它添加到你的视图模型中,因为它没有在 UI 中使用,因此会是一个额外的属性?
  • 我知道视图与他在 TModel 中找到的属性映射。但是我从我的服务中也收到了地址属性,在用户进行一些更改后,我会将数据保存到数据库中。但就像你解释的那样,我最常将地址属性放在 UIModel 中,否则当我保存时我不再有这个值了。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多