首页 文章

使用automapper更新具有关系的实体

提问于
浏览
0

我正在使用EF Core和Automapper来更新我的实体 . 我有一个名为“Aluno”的实体,它与“Endereco”有关系 . 这是代码:

public class Aluno : ApplicationUser{

    ...
    public Endereco Endereco { get; set; }
    ...
}

public class AlunoViewModel : UserViewModel
{
    public int Id { get; set; }

    public EnderecoViewModel Endereco { get; set; }
}

public class Endereco{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get;set; }

   ...
}

public class EnderecoViewModel {

    public int Id { get;set; }
    ...
}

自动配置:

config.CreateMap<Aluno, AlunoViewModel>().ReverseMap();
config.CreateMap<Endereco, EnderecoViewModel>().ReverseMap();

AlunosController:

[HttpPut]
    public JsonResult Put([FromBody]AlunoViewModel vm)
    {
        if (ModelState.IsValid)
        {
            var aluno = _context.Alunos
                .Single(o => o.Id == vm.Id);

            Mapper.Map(vm, aluno);

            _context.SaveChanges();

            Response.StatusCode = (int)System.Net.HttpStatusCode.OK;
            return Json(true);
        }

        Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
        return Json(false);
    }

当我尝试更新“Aluno”实体时,我在context.SaveChanges()上遇到异常:

当IDENTITY_INSERT设置为OFF时,无法在表'Enderecos'中为identity列插入显式值 .

但我不是要插入一个新的“Endereco”,只是更新实体“Aluno”,并且可能更新“endereco”,它在var aluno中正确加载 .

难道我做错了什么?

1 回答

  • 2

    请尝试以下语法:

    Mapper
        .CreateMap<Aluno, AlunoViewModel>()
        .ForMember(
            dest => dest.Endereco,
            opt => opt.MapFrom(src => src.EnderecoViewModel)
        );
    

相关问题