11

Ich verwende EF4 DbContext, um das Modell für eine ASP.NET MVC-App bereitzustellen. Ich verwende ViewModels, um den Ansichten Daten bereitzustellen, und Automapper, um die Zuordnung zwischen den EF POCOs und den ViewModels durchzuführen. Automapper macht eine gute Arbeit, aber ich bin nicht klar, die beste Art, es zu verwenden, nachdem das ViewModel zurück auf den Controller gebucht wurde, um ein Update durchzuführen.Verwenden von Automapper zum Aktualisieren einer vorhandenen Entity POCO

Meine Idee ist es, POCO-Objekt mit einem Schlüssel im ViewModel zu erhalten. Ich möchte dann AutoMapper verwenden, um die POCO mit Daten aus dem Ansichtsmodell zu aktualisieren:

[HttpPost] 
public ActionResult Edit(PatientView viewModel) 
{ 
    Patient patient = db.Patients.Find(viewModel.Id); 
    patient = Mapper.Map<ViewModel, Patient>(viewModel, patient); 
    ... 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

Zwei Fragen:

  1. Die Find() Methode gibt einen Proxy anstatt eine POCO die AutoMapper verursacht zu beklagen. Wie bekomme ich den POCO statt des Proxy?
  2. Ist diese Best Practice für die Durchführung eines Updates?
+0

Diese helfen könnten: http://stackoverflow.com/questions/6156538/entityframework-get-object-by-id – Dmitry

+0

Ich denke, das ist OK, elegant sogar . Sie verwenden die korrekte Überladung von 'Mapper.Map'. –

+0

Dank @Gert Arnold, mein Vertrauen in diesen Ansatz erhöht. –

Antwort

30

Wenn Sie Automapper auf diese Weise verwenden, wird ein neues Patientenobjekt zurückgegeben, und die Verweise auf das Enity-Framework-Diagramm werden nicht beibehalten. Sie haben es so verwenden:

[HttpPost] 
public ActionResult Edit(PatientView viewModel) 
{ 
    Patient patient = db.Patients.Find(viewModel.Id); 
    Mapper.Map(viewModel, patient); 
    ... 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
+0

Ja, ich glaube, dass ein Fehler behoben wurde, seit ich diese Frage gepostet habe, und die Methode, die Sie veranschaulichen, funktioniert nun korrekt. –

1

Es scheint zwei Ansätze zu sein, um mit dem EF-Proxy-Problem zu tun:

  1. Schalten Sie ObjectContext.ContextOptions.ProxyCreationEnabled, entweder für die gesamte Anwendung (in EF Context Konstruktor oder EDMX) oder für die Abfrage, bei der Sie sicherstellen müssen, dass Sie ein tatsächliches Entitätsobjekt anstelle eines Proxys erhalten.
  2. Verwenden Sie eine Erweiterung zu Automapper, hier dokumentiert: https://gist.github.com/935461.

Hinweis. Letzteres ist kommentiert mit "Raum für Verbesserungen. Siehe: Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos".

Verwandte Themen