11

Tôi đang sử dụng EF4 DbContext để cung cấp mô hình cho ứng dụng ASP.NET MVC. Tôi sử dụng ViewModels để cung cấp dữ liệu cho các khung nhìn và Automapper để thực hiện ánh xạ giữa EF POCO và ViewModels. Automapper làm một công việc tuyệt vời nhưng tôi không rõ cách tốt nhất để sử dụng nó sau khi ViewModel được đăng trở lại bộ điều khiển để thực hiện một bản cập nhật.Sử dụng Automapper để cập nhật Thực thể POCO

Ý tưởng của tôi là lấy đối tượng POCO bằng khóa có trong ViewModel. sau đó tôi muốn sử dụng Automapper để cập nhật các POCO với dữ liệu từ các 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"); 
} 

Hai câu hỏi:

  1. Phương pháp Find() trả về một Proxy chứ không phải là một POCO gây Automapper để phàn nàn. Làm thế nào để tôi nhận được POCO thay vì Proxy?
  2. Đây có phải là phương pháp hay nhất để thực hiện cập nhật không?
+0

này có thể giúp: http://stackoverflow.com/questions/6156538/entityframework-get-object-by-id – Dmitry

+0

Tôi nghĩ rằng đây là OK, tao nhã thậm chí . Bạn sử dụng quá tải chính xác của 'Mapper.Map'. –

+0

Cảm ơn @Gert Arnold, tăng sự tự tin của tôi trong cách tiếp cận đó. –

Trả lời

30

Nếu bạn sử dụng Automapper như vậy, nó trả về một đối tượng Bệnh nhân mới và các tham chiếu đến biểu đồ khung làm việc không được giữ. Bạn phải sử dụng nó như thế này:

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

Có, tôi tin rằng một lỗi đã được khắc phục kể từ khi tôi đăng câu hỏi này và phương pháp bạn minh họa hiện hoạt động chính xác. –

1

Dường như có hai cách tiếp cận để đối phó với vấn đề proxy EF:

  1. Tắt ObjectContext.ContextOptions.ProxyCreationEnabled, hoặc cho toàn bộ ứng dụng (trong EF constructor Bối cảnh hoặc EDMX), hoặc cho truy vấn mà bạn cần đảm bảo nhận được đối tượng Thực thể thay vì proxy.
  2. Sử dụng tiện ích mở rộng cho Automapper, được ghi ở đây: https://gist.github.com/935461.

Lưu ý. Sau này được nhận xét với "Phòng để cải thiện. Xem: Automapper : mapping issue with inheritance and abstract base class on collections with Entity Framework 4 Proxy Pocos".

Các vấn đề liên quan