2011-01-09 3 views
0

IQueryable<User>을 POCO로 만들고 싶습니다. O/RM을 POCO로 또는 그 반대로 변환하는 저장소의 두 가지 기능이 있습니다. 한 사용자를 저장하거나 가져올 때이 방법이 잘 작동하지만 IQueryable 사용자를 얻는 방법은 무엇입니까?저장소 패턴의 Entity Framework 및 POCO

public IQueryable<Domains.User> GetUsers() 
{ 
    // This wont work because it can't convert to a store expression 
    return context.JUsers.Select(u => ConvertUserORMToDomain(u)); 
} 

내가 가지고있는 모든 IQA 가능 방법마다 각 POCO 도메인에서 수동으로 변환을 다시 작성해야합니까? 그게 사실이라면 나는 패턴없이 좋을거야.

변환기 : 음 private Domains.User ConvertUserORMToDomain(ORM.JUser ormUser)

답변

2

점의 커플.

당신의 Entity Framework를 사용하고 있는데 왜 ORM 개체를 DTO에 투사해야합니까? 순수 POCO를 사용하는 경우 전혀 예상 할 필요가 없습니다.

당신이하고있는 일을 계속하고 싶다면, 당신은 당신의 ORM 객체와 당신의 POCO와의 중재를 중개하는 레이어가 필요합니다.

예를 들어

, 저장소 :

public IQueryable<JUser> GetUsers() // Note how it returns JUser, not the POCO 
{ 
    return context.JUsers; 
} 

후 서비스 : 즉

public Domains.User GetUserById(int userId) 
{ 
    return repository 
      .GetUsers() // IQueryable<JUser> 
      .Where(x => x.UserId == userId) // filter based on business req 
      .ToList() // materialize query on server 
      .Select(u => ConvertUserOrmToDomain(u)); // project into POCO 
} 

, 당신은 (의 비즈니스 요구 사항을 기반으로 쿼리를 실현하는 방법을 알고있는 관리자가 필요합니다 이 경우 사용자 ID 가져 오기) 및 개체를 도메인 엔터티로 변환하는 방법에 대해 설명합니다.

내가 말했듯이, 이것은 시간 낭비이다 - 에 직접 POOCO를 사용하여 도메인 모델을 나타내면 변환 프로세스가 필요 없다.

+1

감사합니다. 내 도메인 모델을 직접 나타 내기 위해 POCO에 대해 이야기하는 내용의 예를 들려 주시겠습니까? –

+0

@DVark - Entity Framework 4를 사용하고 있다고 가정합니까? 그렇다면 EF4는 "순수 POCO"를 허용합니다. 즉, EDMX의 엔티티를 POCO 클래스에 매핑하는 것을 의미합니다. EF4 POCO에 대한 좋은 스택 질문이 있습니다 - 어디서부터 시작해야할까요? http://stackoverflow.com/questions/2478081/entity-framework-4-poco-where-to-start. 그들은 EF에 의존하지 않으며 비즈니스 규칙/논리를 이러한 개체에 추가 할 수 있습니다. 이러한 규칙은 도메인 모델이됩니다. – RPM1984

+0

즉, EDMX의 "User"엔티티를 "Domains.User"개체에 직접 매핑 할 수 있습니다. – RPM1984

관련 문제