Entity Framework и POCO в шаблоне хранилища - PullRequest
0 голосов
/ 09 января 2011

Я бы хотел, чтобы IQueryable<User> было POCO.У меня есть две функции в моем хранилище, которые преобразуют O / RM в POCO и наоборот.Это прекрасно работает при сохранении или получении одного пользователя, но как насчет получения IQueryable of User?

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)

1 Ответ

2 голосов
/ 10 января 2011

ну пару баллов.

Вы используете 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 для непосредственного представления моделей вашего домена, тогда вам не нужен этот процесс преобразования.

...