尽管使用 opt => opt.Ignore() AutoMapper 将相关实体设置为 null
AutoMapper sets related entities to null despite using opt => opt.Ignore()
我正在尝试通过 AutoMapper(通过 NuGet 安装的最新版本)映射两个相同类型的对象。我的代码:
public class School
{
public int Id {get; set;}
public string Name{get; set;}
public User CreatedBy {{get; set;}
}
public class User
{
public int Id {get; set;}
public string Code {get; set;}
}
我有带 MVC 的 EF 6。在编辑中,学校的副本被提供给视图,当它被提交时,我试图将它映射到数据库中的副本,以便我可以保存它。我不想在映射时更改学校中的用户。所以我的代码是:
在编辑控制器操作中
//...
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
Mapper.CreateMap<School, School>().ForMember(r => r.User, opt => opt.Ignore());
//viewModel.School is an object of School type.
school = Mapper.Map<School>(viewModel.School);
//Here school.User is set to null!
惊讶地发现 school.User 为空。我以为我已经明确排除映射器以忽略目标值。我认为在这种情况下,它应该保留来源 属性。我也尝试过 UseDestinationValue() 。但没有运气。是什么导致了这个错误?我有时想知道是否有任何其他更好的方法可用于特定于 EF 的对象映射。
发生这种情况是因为您正在创建一个新的学校实例,而不是更新您从数据库中提取的实例。
而不是:
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
school = Mapper.Map<School>(viewModel.School);
做:
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
Mapper.Map(viewModel.School, school);
这不是创建一个新实例,而是更新您已有的实例。
顺便说一句,您不应该在您的操作方法中创建地图 - 这应该在您的应用程序初始化中 运行,因为它不需要在每个方法上都 运行。
我正在尝试通过 AutoMapper(通过 NuGet 安装的最新版本)映射两个相同类型的对象。我的代码:
public class School
{
public int Id {get; set;}
public string Name{get; set;}
public User CreatedBy {{get; set;}
}
public class User
{
public int Id {get; set;}
public string Code {get; set;}
}
我有带 MVC 的 EF 6。在编辑中,学校的副本被提供给视图,当它被提交时,我试图将它映射到数据库中的副本,以便我可以保存它。我不想在映射时更改学校中的用户。所以我的代码是:
在编辑控制器操作中
//...
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
Mapper.CreateMap<School, School>().ForMember(r => r.User, opt => opt.Ignore());
//viewModel.School is an object of School type.
school = Mapper.Map<School>(viewModel.School);
//Here school.User is set to null!
惊讶地发现 school.User 为空。我以为我已经明确排除映射器以忽略目标值。我认为在这种情况下,它应该保留来源 属性。我也尝试过 UseDestinationValue() 。但没有运气。是什么导致了这个错误?我有时想知道是否有任何其他更好的方法可用于特定于 EF 的对象映射。
发生这种情况是因为您正在创建一个新的学校实例,而不是更新您从数据库中提取的实例。
而不是:
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
school = Mapper.Map<School>(viewModel.School);
做:
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
Mapper.Map(viewModel.School, school);
这不是创建一个新实例,而是更新您已有的实例。
顺便说一句,您不应该在您的操作方法中创建地图 - 这应该在您的应用程序初始化中 运行,因为它不需要在每个方法上都 运行。