首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoMapper将相关实体设置为null,尽管使用opt => opt.Ignore()

AutoMapper将相关实体设置为null,尽管使用opt => opt.Ignore()
EN

Stack Overflow用户
提问于 2016-01-08 17:44:26
回答 1查看 559关注 0票数 0

我正试图通过AutoMapper (最近通过NuGet安装的最新版本)映射两个相同类型的对象。我的代码:

代码语言:javascript
复制
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;}
}

我有EF 6和MVC。在编辑中,学校的副本被提供给视图,当它被提交时,我试图将它映射到数据库中的一个,以便我可以保存它。我不想改变在学校的用户,同时映射。所以我的代码是:

在编辑控制器动作中

代码语言:javascript
复制
//...
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的对象映射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-11 08:40:42

之所以发生这种情况,是因为您正在创建一个新的学校实例,而不是更新您从数据库中提取的实例。

而不是:

代码语言:javascript
复制
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
school = Mapper.Map<School>(viewModel.School);

做:

代码语言:javascript
复制
var school = db.Schools.FirstOrDefault(s => s.Id == viewModel.SchoolId);
Mapper.Map(viewModel.School, school);

这将更新您已经拥有的实例,而不是创建一个新实例。

顺便说一句,您不应该在操作方法中创建映射--这应该在应用程序初始化中运行,因为它不需要在每个方法上运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34682996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档