2016-12-13 4 views
0

Ich verwende EF Core und Automapper, um meine Entitäten zu aktualisieren. Ich habe eine Entität namens "Aluno", die eine Beziehung zu "Endereco" hat. Hier ist der Code:Verwenden von AutoMapper zum Aktualisieren von Entitäten mit Beziehungen

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

Die AutoMapper Konfiguration:

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

Wenn ich versuche, eine "aluno" Entität zu aktualisieren, erhalte ich eine Ausnahme auf context.SaveChanges():

Kann nicht explizit einfügen Wert für Identitätsspalte in der Tabelle 'Endeecos' , wenn IDENTITY_INSERT auf OFF gesetzt ist.

Aber ich versuche nicht, ein neues „endereço“ einfügen, aktualisieren Sie einfach die Entität „aluno“, und vielleicht aktualisieren, um die „endereço“, die richtig in der var aluno geladen wird.

Mache ich etwas falsch?

+1

Ich glaube, Sie Mapping-Problem. Bitte überprüfen Sie, ob Ihre Mappings korrekt sind, bevor Sie sie speichern. Ihr Aluno-Mapping benötigt die Funktion "ForMember", um das Mapping für seine Eigenschaftsobjekte zu definieren. Können Sie versuchen, ForMember hinzuzufügen (i => i.Endereco, i => i.MapFrom (s => s.Endereco)). – kizilsu

+0

Sie haben Recht! Könnten Sie es als Antwort posten, damit ich es markieren kann? Vielen Dank! – Munir

+0

@Munir: Bitte missbrauchen Sie den AutoMapper nicht, um sich an Entitäten zu binden, dies wird Sie in große Schwierigkeiten bringen, besonders wenn Sie Sammlungen abbilden. AutoMapper ist und war nie für Zwei-Wege-Mappings gedacht. Bitte lesen Sie den AutoMapper-Beitrag hier https://losechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ zu den Anwendungsfällen, für die AutoMapper gedacht war und funktioniert fein. Der Versuch, sie für die bidirektionale Bindung zu missbrauchen, führt dazu, dass a) Ihre Domänenmodelle die Enkapuselung unterbrechen, um dies zu unterstützen, und b) Ihr Persistenzmodell/ORM Mapper Probleme mit den Bindungen hat. – Tseng

Antwort

1

Versuchen Sie, die folgende Syntax:

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

Entschuldigung, müssen Sie ablehnen. Während es das unmittelbare Problem lösen kann, ermutigen Sie das OP und andere, AutoMapper auf die falsche Weise zu verwenden. AutoMapper ist nicht für die Verwendung in Zwei-Wege-Bindungen zu Domänenmodellen oder Persistenzmodell vorgesehen! https://losetechies.com/jimmybogard/2009/09/18/the-case-for-two-way-mapping-in-automapper/ – Tseng

+0

Ich ermutige niemanden, eine bestimmte Art und Weise, etwas zu tun, nur gezeigt, wie AutoMapper sollte verwendet werden, wenn sie es verwenden, keine Notwendigkeit, @Tseng – Yaser

+0

@Tseng zu senken, obwohl Ihr Punkt fast richtig ist, ich denke nicht, ist fair, die Antwort zu verwerfen. Es löst das Problem und Downvoting hilft anderen Menschen nicht. Was würde wirklich helfen, eine Antwort mit der Lösung zu posten, die Sie am geeignetsten finden. – Munir

Verwandte Themen