2009-03-07 7 views
1

Microsoft Entity Framework를 사용하는 3 계층 웹 응용 프로그램에서 작업하고 있습니다. 서로 다른 레이어간에 느슨한 결합을 만들기 위해 데이터 전송 객체를 사용하여 Entity Framework 객체와 내 사용자 객체간에 전송하지만 엔터티 프레임 워크와 사용자 정의 DTO 간에는 변환 속도에 문제가 있습니다. 나는 EF에서 DTO로 전송이 방법을 사용 :데이터 전송 개체 및 엔터티 프레임

public List Transform(List carModelDefinition) {

 List<CarDefinitionDTO> cdDTOList = new List<CarDefinitionDTO>(); 
     foreach (DataLayer.CarModelDefinition cmd in carModelDefinition) 
     { 
      CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
      cdDTO.CarDefinitionId = cmd.CarModelDefinitionId; 
      cdDTO.Compagny = cmd.Company; 
      cdDTO.Model = cmd.Model; 
      cdDTOList.Add(cdDTO); 
     } 
     return cdDTOList; 

} 

을하지만, 예를 들어 목록을 전송하려고 할 때 600 요소 나는 약 10 + 초 걸립니다. 내가 잘못된 것을하고 있습니까, 아니면 단순히 느린 속도입니까? NB. 나는 속도가 느린 내 PC의 속도가 아니므로 꽤 빠른 PC에서 작업하고있다.

+0

당신이 발견하고 문제를 해결 한 이후 향후 독자가 배울 수 있도록이 문제를 업데이트하는, 좋은 것 - 또는 적어도되지 않습니다 그릇된. – Bevan

답변

1

게시 한 코드는 EF 유형과 DTO 유형 사이의 변환 이상의 역할을합니다. 또한 데이터베이스에서 데이터를 가져 오는 것입니다. 두 가지를 측정 목적으로 분리하십시오. 메모리에서 데이터를 이동하는 데 걸린 시간이 아니라, 10 초가 걸리는 데이터 검색이있을 가능성이 있습니다.

+0

해당 함수에서 데이터베이스와 상호 작용하는 위치가 표시되지 않습니까? 필자는 매개 변수 인 목록에서 새 목록을 만듭니다. –

+0

내가 잘못 읽었을 수 있습니다. List 및 List 대신 "List"를 전달하고 반환하는 이유는 무엇입니까? 메소드 호출의 실제 매개 변수는 무엇입니까? IQueryable이 아니라 목록 일뿐입니다. –

+0

맨 위의 func 정의를 본 적이 있는지 여부는 알 수 없습니다 (public list Transform (List carModelDefinition)). UI에서 DataLayer와 UI 사이의 결합을 wan't하지 않기 때문에 Datalayer.Carmodel 정의 대신 DTO를 반환합니다. 따라서 DTO를 사용합니다. –

0

나는 말에 의해로드 :

 public List<CarDefinitionDTO> LoadAll() 
    { 
     List<DataLayer.CarModelDefinition> carList = (from cd in mee.CarModelDefinition select cd).ToList(); 
     CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
     List<CarDefinitionDTO> carDefList = cdDTO.Transform(carList); 
     return carDefList; 
    } 
2

나는 오류를 발견했다. 생성자에서는 엔티티 관리자의 인스턴스를 만들고 새 객체를 만들면 항상 새로운 인스턴스가 만들어 지므로 시간이 많이 걸립니다.

0

DRY! EntitiesToDTOs과 같은 DTO/어셈블러 생성기를 사용해보십시오. Entity Framework EDMX 파일에서 DTO 및 Assemblers를 생성합니다.

var myCar = new Car(); 
CarDTO dto = myCar.ToDTO(); 
myCar = dto.ToEntity(); 

나 :

ICollection<Car> carCol = new List<Car>(); 
ICollection<CarDTO> carDTOs = carCol.ToDTOs(); 
carCol = carDTOs.ToEntities(); 
그런 식으로 당신은 당신이이 같은 코딩을 끝낼 수 있도록 어셈블러 DTO들 당신의 엔티티에 확장 메서드를 추가하고 생성되며, 모든 엔티티/DTO 매핑을 코딩 할 필요가 없습니다

아주 간단하고 도구는 정말 사용하기 쉽습니다.

관련 문제