【问题标题】:Entity Framework and repository pattern problem实体框架和存储库模式问题
【发布时间】:2009-09-26 14:28:03
【问题描述】:

我正在使用带有方法的通用存储库模式:

    private ObjectQuery<T> ObjectQueryList()
    {
        var list = CamelTrapEntities.CreateQuery<T>(EntitySetName);
        return list;
    }

    public IQueryable<T> List()
    {
        return ObjectQueryList();
    }

方法 List() 返回 IQueryable,因为 IQueryable 很容易模拟。我也有扩展方法:

    public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
    {
        if (obj is ObjectQuery<T>)
            (obj as ObjectQuery<T>).Include(path);

        return obj;
    }

此方法在存储库之外用于获取已加载导航属性的实体列表,例如:List.Include("CreatedBy")。问题是它不起作用。所有包含都被忽略。当我将 List() 方法更改为

    public ObjectQuery<T> List()
    {
        return ObjectQueryList();
    }

一切正常。

我应该如何实现存储库模式才能执行更复杂的查询?

【问题讨论】:

    标签: entity-framework repository-pattern


    【解决方案1】:

    Reflector 给了我答案:

    public ObjectQuery<T> Include(string path)
    {
        EntityUtil.CheckStringArgument(path, "path");
        return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path));
    }
    

    Include 返回新的 ObjectQuery 对象,而我的 Include 函数返回旧对象。改为

    public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path)
    {
        if (obj is ObjectQuery<T>)
            return (obj as ObjectQuery<T>).Include(path);
    
        return obj;
    }
    

    解决了这个问题。浪费了几个小时,我更讨厌实体框架:)

    这让我也意识到我应该使用 Include 参数创建另一个 List 函数,并且不允许在存储库之外进行包含。

    【讨论】:

      【解决方案2】:

      Here 是我见过的最全面的 EF 存储库模式实现。我不能确定它是否允许您执行 Include(),但如果我正确阅读了实现,它应该。

      【讨论】:

        【解决方案3】:

        在 EntityFramework 4.1 中,DbExtensions (System.Data.Entity.DbExtensions) 解决了这个问题,并为任何 IQueryable&lt;T&gt; 添加了 .Include([string path]).Include([property expression])

        只需确保使用您的存储库的项目引用 EntityFramework,并且与任何扩展方法一样,在您的类文件中指定 using System.Data.Entity; 以访问这些扩展。

        【讨论】:

          猜你喜欢
          • 2011-05-16
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多