【问题标题】:Automapper Missing Map ConfigurationAutomapper 缺少地图配置
【发布时间】:2014-02-06 19:37:22
【问题描述】:

我有一个参加者课程和一个参加者视图模型

当我从 AttendeeViewModel 映射时,Attendee Model 上的 datetime 字段设置为默认的 .NET Datetime,而不是 Attendee Model 中已经存在的值

这是我的参加者视图模型

public class AttendeeViewModel
{

    public int Id { get; set; }
    [Required]
    [EmailAddress]
    public string Email { get; set; }
    [Required]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Required]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
    public int FEventId { get; set; }

    public string DisplayName
    {
        get { return string.Format("{0}, {1}", FirstName, LastName); }
    }
}

这是我的 Base AttendeeModel

public class Attendee
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public  int Id { get; set; }
    [Required]
    public  string Email { get; set; }
    [Required]
    public  string FirstName { get; set; }
    [Required]
    public  string LastName { get; set; }
    public DateTime CreatedAt { get; set; }

    public bool IsActive { get; set; }


    public int FEventId { get; set; }

    public virtual ApplicationUser CreatedBy { get; set; }

    public virtual FEvent FEvent { get; set; }

    public ICollection<ProjectPledge> ProjectPledges { get; set; } 

}

这是我的映射配置

public static void Configure()
    {

       Mapper.CreateMap<AttendeeViewModel, Attendee>().ForMember(dest=>dest.CreatedAt , opt=>opt.Ignore());

    } 

这是控制器动作

[HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult Edit(AttendeeViewModel attendee)
    {
        if (!_attendeeService.CanAddAttendee(attendee.Email, attendee.FilanthropyEventId))
        {
            AddEmailModelError();
        }

        if (ModelState.IsValid)
        {
            var mappedAttendee = _attendeeService.GetById(attendee.Id);

            mappedAttendee = Mapper.Map<AttendeeViewModel, Attendee>(attendee);
            _attendeeService.AddOrUpdate(mappedAttendee);
            return RedirectToAction(MVC.Attendee.Index(mappedAttendee.FilanthropyEventId));
        }
        return View(attendee);
    }

如果我将配置设置为 opt.Ignore() 的这个 insetad

Mapper.CreateMap<AttendeeViewModel, Attendee>().ForMember(dest=>dest.CreatedAt , opt=>opt.UseDestinationValue());

映射失败并给出此异常

Missing type map configuration or unsupported mapping.

Mapping types:
AttendeeViewModel -> DateTime
MyProject.Web.ViewModels.AttendeeViewModel -> System.DateTime

Destination path:
Attendee.CreatedAt.CreatedAt

Source value:
MyProject.Web.ViewModels.AttendeeViewModel

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 这里有一个提示,在Configure() 的末尾添加一个Mapper.AssertConfigurationIsValid(),这将导致在您的Configure() 中抛出异常,而不是等到您第一次调用Map把它扔掉。 (不知道如何解决您的问题,对不起:()
  • 是的,我一直在使用它,但还是谢谢

标签: c# .net automapper


【解决方案1】:

如果要映射到现有对象,则需要使用采用现有目标的重载:

Mapper.Map<Source, Destination>(source, destination);

这应该可以解决问题。

【讨论】:

    【解决方案2】:

    您是否尝试过删除“.ForMember”部分并让 AutoMapper 忽略它?为了对您有更多帮助,查看两个模型进行比较会有所帮助。

    更新:在查看您的模型后,我建议以下应该解决您遇到的问题...

    Mapper.CreateMap <attendeeviewmodel, attendee>.ForMember (x => x.CreatedAt, opt => opt.MapFrom (src => datetime.utcnow));
    

    【讨论】:

    • 仍将目标数据时间设置为默认值。今晚晚些时候将发布模型
    • 你的问题分类了吗?
    • 对不起,我的问题应该更明确一点。我希望映射的值是参加者对象的原始值,而不是当前时间
    • 你有没有尝试在最后添加“.IgnoreAllUnmapped()”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2014-05-27
    • 2018-11-15
    • 1970-01-01
    • 2019-03-01
    • 2017-04-16
    相关资源
    最近更新 更多