2011-04-22 4 views
3

Service Layer --> Repository --> Entity Framework (Code-First) w/POCO objects 접근 방식을 사용하고 있으며 엔티티를 업데이트하는 데 어려움을 겪고 있습니다.Entity Framework 서비스 계층 업데이트 POC0

내 도메인 개체를 내 View Model에 매핑하기 위해 AutoMapper를 사용하고 있는데, 이는 데이터를 가져 오는 데 적합합니다. 어떻게 변경 사항을 데이터베이스에 다시 가져 오지 않습니까?

순수 POCO 개체를 사용하면 변경 추적이 없다고 가정하므로 내 처리 방법은 직접 처리하는 것입니다. 보기 모델에 도메인 객체와 동일한 속성이 있는지 확인하십시오. 보기 모델에서 필드를 하나만 변경하면 어떻게됩니까? 도메인 객체의 나머지 필드는 기본값으로 데이터베이스에 덮어 쓰지 않습니까?

그렇다면 최상의 접근 방법은 무엇입니까?

감사합니다. 내가이 이것에 걸림돌하고

편집

그래서, 예를 들어 간단한 Customer 걸릴 수 있습니다 :

1) Controller이 서비스 GetCustmoerByID 메소드를 호출 서비스, CustomerService을 가지고 있습니다.

2) 을 호출하고 Customer 개체를 검색합니다.

3) Controller은 AutoMapper를 사용하여 CustomerViewModel에 매핑합니다.

4) Controller 모델을 View으로 가져옵니다. 모든것이 좋아!

이제보기에서 고객의 수정을 수행하고 컨트롤러에 다시 게시하여 변경 사항을 데이터베이스에 유지합니다.

이 시점에서 개체가 분리되어 있다고 가정합니다. 모델에 Customer 개체와 동일한 속성이 있어야합니까? 그리고 표시하고 싶지 않은 각 항목에 대해 숨겨진 필드를 만들어야하므로 계속 유지할 수 있습니까?

개체를 데이터베이스에 다시 저장하는 것을 어떻게 처리합니까? 보기/모델이 객체의 두 개의 필드 만 처리하는 경우 어떻게됩니까?

+0

Automapper를 사용하여 편도를 매핑하는 경우 다른 방법으로 매핑하는 데 사용할 수없는 이유는 무엇입니까? – stephen776

답변

3

당신은 분리 된 개체와 당신이 당신의 분리 된 실체의 변화에 ​​대한 컨텍스트를 알리는 책임이 있음을 절대적으로 옳다.

기본 접근 방식은 단지 엔티티가 수정 된 것으로 설정됩니다. 스칼라 및 복합 속성에 대해서는 작동하지만 탐색 속성 (FK 관계 제외)에는 작동하지 않습니다. 탐색 속성 문제 확인에 대한 추가 정보는 this answer입니다 (EFv4 및 ObjectContext API와 관련이 있지만 DbContext API와 동일한 문제가 있음). 이 접근법의 단점은 DB의 모든 필드가 수정된다는 것입니다. 단일 필드를 수정하려는 경우에도 다른 필드를 올바르게 채워야합니다. 그렇지 않으면 데이터베이스 레코드가 손상됩니다.

변경된 필드를 명시 적으로 정의하는 방법이 있습니다. 전체 엔터티 대신 속성 당 수정 된 상태를 설정합니다. 일반적인 접근법에서 이것을 해결하는 것이 조금 어렵지만 EFv4EFv4.1에 대해 몇 가지 방법을 보여 주려고했습니다.

5

EF 코드 우선, 즉 DbContext API를 사용하는 경우 컨텍스트 클래스에서 처리하는 변경 내용 추적 기능이 있습니다.

귀하의 개체를 변경 한 후에는 귀하의 컨텍스트에서 SaveChanges()으로 전화하면 변경 사항이 데이터베이스에 유지됩니다.

편집는 :

당신이 AutoMapper를 사용하여 개체의 "복사"를 만들기 때문에, 그것은 당신의 상황에를 부착 더 이상 없습니다.

당신이 할 수있는 일은 ASP.NET MVC (UpdateModel)에서했던 것과 비슷합니다.컨텍스트에서 원래의 엔티티를 가져오고, 변경된 속성을 포함 할 수있는 ViewModel을 가져 와서 이전 엔티티를 수동으로 (수정 된 속성 만) 업데이트하거나 AutoMapper를 사용하여 업데이트 할 수 있습니다. 그런 다음 context.SaveChanges()을 사용하여 변경 사항을 유지하십시오.

다른 해결책은 모델 엔터티를 ViewModel [부분 모델]로 보내는 것입니다. 이렇게하면 컨테이너에 으로 연결되고 변경 사항 추적 기능이 계속 작동합니다. 이 도움이

희망 :

+0

OP에서 제 편집을 참조하십시오. 감사! – Sam

1

@AbdouMoumen에 동의합니다.보기 수준에서 모델 엔티티를 사용하는 것이 훨씬 간단합니다. 서비스 계층은 해당 엔티티를 데이터 저장소 (db)에 유지하기위한 API를 제공해야합니다. 서비스 계층은 저장소 변호사 (예 : 모든 엔티티에 대해 Save (엔터티))를 복제하지 말고 오히려 엔티티 집합에 대해 높은 수준의 저장을 제공해야합니다. 예를 들어 서비스 계층에 Save (order)를 사용하면 인벤토리, 고객, 계정과 같은 기본 엔티티를 업데이트 할 수 있습니다.

관련 문제