Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoMapper未按预期工作?_C#_Asp.net_Asp.net Mvc_Automapper - Fatal编程技术网

C# AutoMapper未按预期工作?

C# AutoMapper未按预期工作?,c#,asp.net,asp.net-mvc,automapper,C#,Asp.net,Asp.net Mvc,Automapper,我的域层有一个类,如下所示: 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

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

 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);
        }
然后,我在控制器和viewModel builder中进行映射,以将我的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
现在,在安装方法中的AutoMapperBootstrapper类中,我有以下内容:

  Mapper.CreateMap<Domain.Models.Employee, Employee>();
  Mapper.CreateMap<Employee, Domain.Models.Employee>();
当我在从域映射到viewModel的过程中遇到断点时,我会看到模型。Employee的值来自屏幕,但当我跨过这一行时,值不会映射到域Employee,然后映射到模型。字符串的Employee值重置为null,双精度的值重置为0.0,等等


我的配置或automapper的使用是否有问题?

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

//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 viewModel=Mapper.Map(domainModel) 您传递了错误的参数。若要使用现有实例,请确保第一个参数是源,第二个参数是目标

尝试切换参数

//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 

您是否在引导程序结束时断言您的AutoMapper配置正确?(即,
Mapper.assertconfigurationsvalid();
)我认为您传递了错误的参数,注释是从viewModel设置的域,但您似乎实际上是从一个域设置到另一个viewModel。第一个参数是source,第二个参数是destination,尝试切换参数..@EdChapel-这样做我得到了一个错误-说找到了未映射的成员-包括CreateDate/CreateUserName,UpdateDate,UpdateUserName包含在员工从中继承的AuditableEntity类中-我如何设置AutoMapper以忽略这些不在我的viewModel中的属性?我也想映射这些属性?@Ctrl\u Alt\u失败搜索“AutoMapper ignore”
Mapper.Map(employee,viewModel.employee).formMember(e=>e.CreateDate,x=>x.Ignore())新实例,那么我们如何得到结果呢?
Map()
函数获取源类型的实例和目标类型的实例。CreateMap()是注册类型的地方。。试试看。。。您将看到。映射是根据您注册的类型完成的,但您必须将实例传递给
Map()
方法。我通常会创建一个静态的
MapFrom()
方法到我的映射器类。也许你的意思是
model.Employee=Mapper.Map(viewEmployee,new model.Employee())
viewmodel.EmployeeDetailsViewModel model=newemployeedetailsviewmodel();model.Employee=Mapper.Map(Employee,newviewmodel.Employee())我已经更新了我的答案,自动映射器应该被编码以获得填充模型对象的实例。
var viewModel = Mapper.Map<ViewModel.Employee>(domainModel);  <-- this creates a ViewModel for a Domain Model
var domainModel  = Mapper.Map<Domain.Employee>(viewModel);
//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