存储库模式中的实体框架和POCO

时间:2011-01-09 20:00:36

标签: .net entity-framework repository-pattern poco

我希望IQueryable<User>成为POCO。我的存储库中有两个函数将O / RM转换为POCO,反之亦然。这在保存或获取一个用户时工作正常,但是如何获得用户的IQueryable呢?

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

我是否必须在每个IQueryable方法中手动重写每个POCO域的转换?如果是这样的话,我会没有模式会更好。

转换器:private Domains.User ConvertUserORMToDomain(ORM.JUser ormUser)

1 个答案:

答案 0 :(得分: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直接表示您的域模型,然后您不需要转换过程。