【问题标题】:Automapper cannot fill the propertiesAutomapper 无法填充属性
【发布时间】:2016-09-06 15:04:39
【问题描述】:

我在 MVC 项目中使用 Automapper,在该项目中我还使用 ASP.NET Identity 并从 ApplicationUser 类继承到我的自定义用户表:Student 和 Coordinator。问题是;我检索用户数据,其中有填充的自定义属性(称为 Number),但在应用 Automappe 的映射后,它只填充 ApplicationUser 中的属性,并且 Number 属性为空。是否有任何错误或如何解决?

领域模型:

public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
    public string Name { get; set; }

    public string Surname { get; set; } 

    //code omitted for brevity
}

public class Student: ApplicationUser
{     
    public int? Number { get; set; }
}

视图模型:

public class RegisterViewModel
{
    public int Id { get; set; }     

    public int? Number { get; set; }

    //code omitted for brevity
}

控制器:

[AllowAnonymous]
[HttpGet]
public  ActionResult Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    ApplicationUser user = db.Users.Find(id);
    if (user == null)
    {
        return HttpNotFound();
    }

    var config = new MapperConfiguration(cfg => {
        cfg.CreateMap<ApplicationUser, RegisterViewModel>();
    });

    IMapper mapper = config.CreateMapper();
    //var source = new ApplicationUser();
    var dest = mapper.Map<ApplicationUser, RegisterViewModel>(user);

    return PartialView("_Details", dest);
}

【问题讨论】:

  • 另一件事 - 您不应该在每个控制器操作上配置 AutoMapper。 AutoMapper 配置就像 EF 配置一样 - 静态并且每个 AppDomain 定义一次。您应该在 global.asax 或类似文件中有一个 Mapper.Initialize 并初始化您的地图一次。
  • @JimmyBogard 感谢您的回复。 1) 您能否发布一个示例作为答案? 2) 我需要在Controller中将ApplicationUser转换为RegisterViewModel,在这种情况下,有什么办法可以解决这个问题吗?可以回复一下吗?
  • 你能告诉我们RegisterViewModel吗?

标签: c# asp.net asp.net-mvc asp.net-identity automapper


【解决方案1】:

我不希望它映射Number。你说的是两种不同的类型。如果db.Users.Find(id);ApplicationUser,那么它不会像您展示的那样工作,因为ApplicationUser 没有Number 属性。

如果从db.Users.Find(id); 返回的对象确实是Student。然后cast它并从Student做映射

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<Student, RegisterViewModel>()
        .ForMember(dest => dest.Id, opt => opt.Ignore());
});

Mapper.AssertConfigurationIsValid();

var myAppUser = new ApplicationUser();
var student = myAppUser as Student;
var appUserResult = Mapper.Map<RegisterViewModel>(student);

【讨论】:

  • 您分析了问题并提出了很好的解决方案。对于那些遇到相同问题的人 .ForMember(dest => dest.Xxx, opt => opt.Ignore() 行也应该为所有其他自定义属性添加。非常感谢.. .
【解决方案2】:

不要像这样映射“AppicationUser”映射学生:

var dest = mapper.Map<Student, RegisterViewModel>(user);

还要在配置中更改地图:

cfg.CreateMap<Student, RegisterViewModel>();

希望对你有帮助

【讨论】:

  • 但是用户感谢,但是用户是 AppicationUser 类型并且拳击不能解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多