11

Używam DbContext EF4, aby udostępnić model aplikacji ASP.NET MVC. Używam ViewModels do dostarczania danych do widoków i Automappera, aby wykonać mapowanie między EF POCO a ViewModels. Automapper wykonuje świetną robotę, ale nie jestem pewien, jaki jest najlepszy sposób jej użycia po przesłaniu ViewModel do kontrolera w celu przeprowadzenia aktualizacji.Używanie Automappera do aktualizacji istniejącej jednostki POCO

Mój pomysł polega na pobraniu obiektu POCO za pomocą klucza zawartego w ViewModelu. Następnie chcę używać Automapper zaktualizować poco danymi z 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"); 
} 

dwa pytania:

  1. Sposób

    find() zwraca Proxy zamiast POCO co powoduje Automapper narzekać. Jak uzyskać POCO zamiast Proxy?
  2. Czy ta metoda służy do aktualizacji?
+0

To może pomóc: http://stackoverflow.com/questions/6156538/entityframework-get-object-by-id – Dmitry

+0

myślę, że jest OK, nawet elegancki . Używasz właściwego przeciążenia 'Mapper.Map'. –

+0

Dzięki @Gert Arnold, zwiększyłem moje zaufanie do tego podejścia. –

Odpowiedz

30

Jeśli używasz Automapper w ten sposób, zwraca on nowy obiekt Pacjenta, a odniesienia do wykresu szkieletu enity nie są zachowywane. Trzeba używać go tak:

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

Tak, wierzę, że usunięto błąd od czasu opublikowania tego pytania, a metoda, którą zilustrowałeś teraz, działa poprawnie. –

1

Nie wydają się być dwa podejścia do czynienia z EF emisji Proxy:

  1. Wyłączyć ObjectContext.ContextOptions.ProxyCreationEnabled, zarówno dla całej aplikacji (w konstruktorze Context EF lub EDMX), lub do kwerenda, w której musisz zagwarantować otrzymanie rzeczywistego obiektu obiektu, a nie proxy.
  2. Korzystanie z rozszerzenia do Automapper, udokumentowane tutaj: https://gist.github.com/935461.

Uwaga. Ten ostatni jest komentowany przez "Miejsce na ulepszenia. Patrz: Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos".