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