【发布时间】: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 => e.CreateDate, x => x.Ignore());
标签: c# asp.net asp.net-mvc automapper