2011-01-09 2 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)); 
} 

ли я вручную переписать мое преобразование в каждом домене POCO в каждом методе IQueryable у меня есть? Мне было бы лучше без шаблонов, если это так.

Преобразователь: 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) и как перевести объекты в объекты вашего домена.

Как я уже сказал, это пустая трата времени IMO - используйте POCO's для , непосредственно представляя ваши модели домена, тогда вам не нужен этот процесс преобразования.

+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». – RPM1984

Смежные вопросы