11

Sto utilizzando EF4 DbContext per fornire il modello per un'applicazione ASP.NET MVC. Uso ViewModels per fornire dati alle viste e Automapper per eseguire la mappatura tra EF POCO e ViewModels. Automapper fa un ottimo lavoro ma non sono chiaro il modo migliore di usarlo dopo che ViewModel è stato posticipato al controller per effettuare un aggiornamento.Utilizzo di Automapper per aggiornare un'entità POCO esistente

L'idea è di ottenere l'oggetto POCO utilizzando una chiave contenuta nel ViewModel. Io poi voglio usare Automapper per aggiornare la POCO con i dati del ViewModel:

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

due domande:

  1. Il metodo Find() restituisce un proxy piuttosto che un POCO che provoca Automapper a lamentarsi. Come ottengo il POCO invece del Proxy?
  2. Questa procedura consigliata per eseguire un aggiornamento?
+0

Questo potrebbe aiutare: http://stackoverflow.com/questions/6156538/entityframework-get-object-by-id – Dmitry

+0

penso che questo è OK, elegante anche . Si utilizza il sovraccarico corretto di 'Mapper.Map'. –

+0

Grazie a @Gert Arnold, ho aumentato la mia fiducia in questo approccio. –

risposta

30

Se si utilizza Automapper in questo modo, viene restituito un nuovo oggetto Paziente ei riferimenti al grafico della struttura di enity non vengono mantenuti. Devi usare in questo modo:

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

Sì, credo che un bug sia stato corretto da quando ho postato questa domanda, e il metodo che illustrate ora funziona correttamente. –

1

Sembra che ci siano due approcci per affrontare la questione delega EF:

  1. Spegnere ObjectContext.ContextOptions.ProxyCreationEnabled, sia per l'intera applicazione (in Context EF costruttore o EDMX), o per la query in cui è necessario garantire l'ottenimento di un oggetto Entity effettivo anziché di un proxy.
  2. Utilizzo di un'estensione di Automapper, documentata qui: https://gist.github.com/935461.

Nota. Quest'ultimo viene commentato con "Room for improvement" vedi: Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos ".

Problemi correlati