【问题标题】:AutoMapper not working as expected?AutoMapper 没有按预期工作?
【发布时间】:2014-08-17 15:23:13
【问题描述】:

我的域层有一个类,如下所示:

 public class Employee : AuditableEntity
    {
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public double Salary{ get; set; }
        public int PhoneNo { get; set; }

        public double Bonus
        {
            get { return Salary + EmployeeAdditionals.Sum(e => e.Value); }
        }

        // virtual allow lazy loading
        public virtual ReadOnlyCollection<EmployeeAdditional> EmployeeAdditionals { get; private set; }

        // Paramterless constructor for EF
        public Employee()
        {
            EmployeeAdditionals = new List<EmployeeAdditional>();
        }

        public void AddAdditionalInfo(EmployeeAdditional additionalInfo)
        {
            additionalInfo.Employee = this;
            additionalInfo.EmployeeId = Id;

            ((Collection<EmployeeAdditional>) EmployeeAdditionals).Add(additionalInfo);
        }

然后我的 MVC 5 应用程序中有以下 viewModel 类:

 public class EmployeeDetailsViewModel : BaseViewModel
    {
        public EmployeeDetailsViewModel()
        {
            Employee = new Employee();
        }

        public Employee Employee { get; set; }
        //Other fields

    }

    public class Employee
    {
        [DisplayName("Employee First Name")]
        public string FirstName { get; set; }

        [DisplayName("Employee Surname")]
        public string Surname{ get; set; }

        public double Salary{ get; set; }

        [RegEx for Phone Number and Error Mesage]
        public int PhoneNo{ get; set; }

        public double Bonus { get; set; }
    }

然后我在我的控制器和 viewModel 构建器中进行了映射,以将我的视图模型映射到我的域模型和域模型回到视图模型,我正在尝试使用 AutoMapper。

使用如下手动映射:

// set domain from viewModel
employee.FirstName= model.Employee.FirstName;
//etc for rest of fields

// set view model from domain
viewModel.Employee.FirstName = employee.FirstName;
//etc for rest of fields

现在在 Setup 方法中的 AutoMapperBootstrapper 类中,我有以下内容:

  Mapper.CreateMap<Domain.Models.Employee, Employee>();
  Mapper.CreateMap<Employee, Domain.Models.Employee>();

然后我在我的控制器和视图模型构建器中使用它:

//set domain from viewModel
Mapper.Map(employee, model.Employee);

// set viewmodel from domain
Mapper.Map(viewModel.Employee, employee);

当我在从域映射到 viewModel 时遇到断点时,我看到 model.Employee 带有来自屏幕的值,但是当我越过这条线时,值不会映射到域雇员,然后 model.Emplyee 值被重置为字符串为 null,为双精度为 0.0,等等。

我的配置或使用自动映射器有什么不正确的地方吗?

【问题讨论】:

  • 您是否断言您的 AutoMapper 配置在引导程序结束时是正确的? (即Mapper.AssertConfigurationIsValid();
  • 我认为您传递的参数不正确,注释是 set domain from viewModel,但似乎您实际上是从 domain 设置为 viewModel。第一个参数是源,第二个参数是目标,尝试切换参数..
  • @EdChapel - 这样做我得到一个错误 - 说找到了未映射的成员 - 包括 CreateDate/CreateUserName、UpdateDate、UpdateUserName,它们包含在 Employee 继承的 AuditableEntity 类中 - 我如何设置 AutoMapper忽略这些不在我的视图模型中的属性,我也想映射?
  • @Ctrl_Alt_Defeat 搜索“AutoMapper Ignore”。 Mapper.Map(employee, viewModel.Employee).ForMember(e =&gt; e.CreateDate, x =&gt; x.Ignore());

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


【解决方案1】:

你传递了错误的参数。如果要使用现有实例,请确保第一个参数是源,第二个参数是目标。

尝试切换参数。

//set domain from viewModel (viewModel is the source)
Mapper.Map(model.Employee, employee);
              ^^^^^         ^^^^^
              source      destination 

// set viewmodel from domain (domain is the source)
Mapper.Map(employee, viewModel.Employee);
            ^^^^^           ^^^^^
            source      destination 

【讨论】:

    【解决方案2】:

    你的地图代码不应该是这样的吗?您必须使用Map() 的实例,看起来您正在使用Types

    //set domain from viewModel
    Mapper.Map(viewEmployee, new model.Employee());
    
    // set viewmodel from domain
    Mapper.Map( employee, new viewmodel.Employee());
    

    这就是我希望你使用它的方式:

    var viewModel = Mapper.Map<ViewModel.Employee>(domainModel);  <-- this creates a ViewModel for a Domain Model
    

    反之则为:

    var domainModel  = Mapper.Map<Domain.Employee>(viewModel);
    

    【讨论】:

    • 新实例,那么我们如何得到结果呢?
    • Map() 函数采用源类型的实例和目标类型的实例。 CreateMap() 是您注册类型的地方.. 试试看... 你会看到的。
    • 映射是根据您注册的类型完成的,但您必须将实例传递给Map() 方法。我通常为我的 Mapper 类创建一个静态 MapFrom() 方法。
    • 也许你的意思是model.Employee employee = Mapper.Map(viewEmployee, new model.Employee());viewmodel.EmployeeDetailsViewModel model = new EmployeeDetailsViewModel(); model.Employee = Mapper.Map(employee, new viewmodel.Employee());
    • 我已经更新了我对 AutoMapper 应该被编码以获得填充模型对象的实例的答案。
    猜你喜欢
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    • 2015-05-18
    相关资源
    最近更新 更多