帮助理解AutoMapper的基础知识

时间:2011-07-07 20:44:19

标签: asp.net asp.net-mvc automapper

所以我有这两个课程:

public class PhysicalTest
    {
        public int ID { get; set; }       
        public DateTime CreationDate { get; set; }
        public int Weight { get; set; }
        public int Height { get; set; }
        public int Systolic { get; set; }  
        public int Diastolic { get; set; } 
        public int Pulse { get; set; }
}

public class PhysicalTestFormViewModel
    {
        public int ID { get; set; }       
        public DateTime CreationDate { get; set; }
        [Required]
        public int Weight { get; set; }
        [Required]
        public int Height { get; set; }
        public int Systolic { get; set; }  
        public int Diastolic { get; set; } 
        public int Pulse { get; set; }
}

这是我的AutoMapper配置

Mapper.CreateMap<PhysicalTestFormViewModel, PhysicalTest>();

当我这样做时,它可以正常工作

 [HttpPost]
        public ActionResult Create(int ehrId, PhysicalTestFormViewModel physicaltestvm)
        {
            EHR ehr = ehrRepository.Find(ehrId);
            if (ehr.UserName != User.Identity.Name)
                return View("Invalid Owner");

            if (ModelState.IsValid)
            {
                PhysicalTest physicalTest= new PhysicalTest();
                Mapper.Map(physicaltestvm, physicalTest);
                physicalTest.PerformedBy = "Yo";
                physicalTest.CreationDate = DateTime.Now;
                ehr.PhysicalTests.Add(physicalTest);
                ehrRepository.Save();
                return RedirectToAction("Index");
            }
            else
            {
                return View(physicaltestvm);
            }
        }

但是当我这样做时,我收到错误

  

尝试映射Summumnet.PhysicalTest   至   Summumnet.ViewModels.PhysicalTestFormViewModel。   缺少类型映射配置或   不支持的映射。类型异常   'AutoMapper.AutoMapperMappingException'   被扔了。

public ActionResult Edit(int ehrId, int id)
        {
            EHR ehr = ehrRepository.Find(ehrId);
            if (ehr.UserName != User.Identity.Name)
                return View("Invalid Owner");
            var physicalTest = ehr.PhysicalTests.Where(test => test.ID == id).Single();
            PhysicalTestFormViewModel physicaltestvm = new PhysicalTestFormViewModel(); 
            Mapper.Map(physicalTest, physicaltestvm); 
            return View(physicaltestvm);
        }

在抛出错误的场景中,我只想构建一个ViewModel来显示一个Edit表单....这样做的标准方法是什么?

2 个答案:

答案 0 :(得分:3)

您只定义了从PhysicalTestFormViewModelPhysicalTest的映射:

Mapper.CreateMap<PhysicalTestFormViewModel, PhysicalTest>();

你还需要相反的一个:

Mapper.CreateMap<PhysicalTest, PhysicalTestFormViewModel>();

请参阅this相关的SO问题和答案。

答案 1 :(得分:0)

您可以在不必创建任何地图的情况下进行动态映射

public ActionResult (PhysicalTestFormViewModel ptvm)
{
  //other to wrote codes
EHR ehr = ehrRepository.Find(ehrId);

AutoMapper.Mapper.DynamicMap<PhysicalTestFormViewModel, PhysicalTest>(ptvm, ehr);

db.SaveChanges();
}