使用EF4的存储库模式难以加入集合

时间:2011-08-25 09:13:02

标签: entity-framework-4 linq-to-entities repository-pattern specification-pattern

我无法将设计置于正确的背后。我正在使用存储库模式来管理我的数据层。在我的一个控制器(MVC3)中,我正在构建一个需要执行连接的LINQ查询。我有两个问题:

  1. 最好是在我的存储库中添加一个方法来执行所有连接,预测等吗?我对此有点犹豫,因为它会导致我的存储库中的合同定义不断增加?
  2. 假设我在Post repo中有一个List()方法,它返回所有项目。我目前无法在linq(连接)查询中使用此方法,因为它无法将其转换为存储表达式。请注意,下面的代码使用一个名为repo的类,它使用相同的上下文实例保存对我所有存储库(post,friends)的引用。
  3. BIG EDIT: 现在事情对我来说有点清楚,但我希望有人会跳进这里,帮助我把所有事情都整理好;-)。我要做的是实现规范模式以及我的存储库模式。问题是,我正在使用POCO,我的存储库正在使用一个使用IObjectSets的IContext接口。所以在下面的列表方法中,Posts是一个IObjectSet,Context是一个IContext接口,我将注入我的实际上下文。

    我一直在阅读,并且有一些非常好的准备使用代码,比如 implementing-repository-pattern-with-ef4-poco-supportimplementing-repository-pattern-with-entity-framework

    这两个示例都使用存储库中的objectContext。是不是更好地抽象出来呢?

    我的存储库:

    public System.Linq.IQueryable<Post> List()
    {
        return this.context.Posts;
    }
    

    在我的控制器方法中:

    var friendquestions = (from q in base._repo.Post.List().OfType<Question>()
                           from f in _repo.Friends.List()
                           where f.userId == myid
                           where q.Author == f.friendId
                           select q.Id).ToArray();
    

    以下情况有效(为什么?):

    var temp = (from q in base._repo.Post.List().OfType<Question>()
                where q.Id > 6
                select q.Id).ToArray();
    

    这与此处描述的问题基本相同:linq-to-entities-does-not-recognize-the-method

    我该如何设计呢?我一直在阅读模型定义的函数,但我不确定这是不是可行的方法?

    提前致谢

1 个答案:

答案 0 :(得分:0)

抽出那个也不是更好吗?

回答:您可以查看Ritesh rao的NCommon。它已被IEFSession用于包装 ObjectContext。