2016-12-13 49 views
0

我正在使用EF Core和Automapper更新我的實體。我有一個名爲「Aluno」的實體,它與「Endereco」有關係。下面是代碼:使用automapper更新具有關係的實體

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; } 
    ... 
} 

的automapper配置:

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' 中的標識列的值。

但是我不想插入新的「Endereco」,只需更新實體「Aluno」,也許更新「Endereco」,這是正確加載var aluno內部。

我做錯了什麼?

+1

我認爲你必須映射問題。保存操作前請檢查您的映射是否正確。您的Aluno映射需要「ForMember」函數來爲其屬性對象定義映射。你可以嘗試添加ForMember(i => i.Endereco,i => i.MapFrom(s => s.Endereco))。 – kizilsu

+0

你是對的!你可以把它作爲答案發布,以便我可以標記它嗎?謝謝! – Munir

+0

@Munir:請不要濫用AutoMapper綁定到實體,這會給您帶來很大麻煩,特別是在映射回集合時。 AutoMapper是和從未用於雙向映射。請閱讀AutoMapper作者的帖子,在這裏https://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/關於AutoMapper的用途和用途精細。試圖將其用於雙向綁定會導致a)您的域模型違反封裝以支持這種綁定,以及b)您的持久性模型/ ORM Mapper遇到綁定問題。 – Tseng

回答

1

試試下面的語法:

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

對不起,需要downvote。雖然它可能解決當前的問題,但您只是鼓勵OP和其他人以錯誤的方式使用AutoMapper。 AutoMapper不打算用於域模型或持久性模型的雙向綁定! https://lostechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ – Tseng

+0

我不鼓勵任何人使用任何特定的方式做任何事情,只是展示瞭如何應該使用AutoMapper,如果他們正在使用它,不需要downvote @Tseng – Yaser

+0

@Tseng,雖然你的觀點幾乎是正確的,但我認爲公平地否定答案是公平的。它解決了這個問題,而降低投票將不會幫助其他人。真正有用的將是用您認爲最合適的解決方案發布答案​​。 – Munir