【问题标题】:Entity Framework and POCO in repository pattern存储库模式中的实体框架和 POCO
【发布时间】:2011-06-06 04:47:30
【问题描述】:

我希望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)

【问题讨论】:

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


    【解决方案1】:

    嗯,有几点。

    您使用实体框架,那么为什么需要将 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 来直接表示您的域模型,然后您不需要那个转换过程。

    【讨论】:

    • 谢谢,你能举个例子说明你用 POCO 直接代表我的领域模型吗?
    • @DVark - 我假设您使用的是实体框架 4?如果是这样,EF4 允许“纯 POCO”,这意味着将 EDMX 上的实体映射到 POCO 类。在 EF4 POCO 上有一个很好的 Stack 问题 - 从哪里开始? :stackoverflow.com/questions/2478081/…。它们不依赖 EF,您可以向这些对象添加业务规则/逻辑 - 它们成为您的域模型。
    • 换句话说 - 您可以将 EDMX 上的“用户”实体直接映射到“Domains.User”对象。
    • 哈哈!谢谢伙计,我一直在做 POCO 错误,好吧,我不知道我一直在做什么,因为我有我的域,我也让 EF 生成类,然后我将这些生成的类转换为我写的域在我的问题中。
    • 呵呵,是的 - 这是一个不必要的步骤。 DB 表直接映射到 POCO/域对象。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多