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?
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
Sie haben Recht! Könnten Sie es als Antwort posten, damit ich es markieren kann? Vielen Dank! – Munir
@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